{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 99,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-11-18T09:03:19.411874Z",
     "start_time": "2019-11-18T09:03:19.302379Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Populating the interactive namespace from numpy and matplotlib\n"
     ]
    }
   ],
   "source": [
    "import pandas as pd\n",
    "import numpy as np\n",
    "import seaborn as sns\n",
    "%pylab inline\n",
    "\n",
    "from sklearn.metrics import log_loss, classification_report\n",
    "import lightgbm as lgb"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-11-18T08:37:31.783616Z",
     "start_time": "2019-11-18T08:37:31.718815Z"
    }
   },
   "outputs": [],
   "source": [
    "test_df = pd.read_csv('../input/test/test.csv', \n",
    "                      names=['n'+str(i) for i in range(1, 65)])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 56,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-11-18T08:46:40.272536Z",
     "start_time": "2019-11-18T08:46:40.132657Z"
    },
    "scrolled": true
   },
   "outputs": [],
   "source": [
    "train_df = pd.concat([pd.read_csv('../input/train/0.csv'), pd.read_csv('../input/train/1.csv'),\n",
    "                       pd.read_csv('../input/train/2.csv'), pd.read_csv('../input/train/3.csv'),]\n",
    "                      ,axis=0)\n",
    "train_df.drop(['Unnamed: 0'], axis=1, inplace=True)\n",
    "train_df.columns = ['n'+str(i) for i in range(1, 65)] + ['label']\n",
    "train_df.reset_index(drop=True, inplace=True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 102,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-11-18T09:04:20.319515Z",
     "start_time": "2019-11-18T09:04:19.410698Z"
    },
    "scrolled": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.axes._subplots.AxesSubplot at 0x7f1f8c34d5c0>"
      ]
     },
     "execution_count": 102,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAkgAAAJRCAYAAAC+x0j8AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvOIA7rQAAIABJREFUeJzs3XuYXXddL/73e0/mPpN7eg+dtoa2JISUjEVQBAVKjweoJQLlVy9cJFYFVFQesII8VDwcW45HISqpFtHTH+jvaAWBSiqIXEs7gfQSktJbShvoLWnSyUxmMpn9+f0xO7DZ3Z93krX37Oxh3q/nmad71mfWXt+9bvn2u9d6L0YEzMzMzOwHSie6AWZmZmbtxh0kMzMzsxruIJmZmZnVcAfJzMzMrIY7SGZmZmY13EEyMzMzq+EOkpmZmZ1wJK8j+SjJO5M6Sf4FyXtI3k7y2VW1XyF5d+XnV5rRHneQzMzMrB38HYCLRf2/AVhV+dkI4K8AgORSAH8E4DkALgTwRySXNNoYd5DMzMzshIuILwLYK/7kEgB/HzNuBrCY5KkAXgrgpojYGxFPALgJuqN1TNxBMjMzs7ngdAAPVv3+UGVaNr0hCxp9g2NF8lUA3gPgfAAXRsSI+vupx+9Ln4Hy72uuTOe7uYdp7Qkcrjv9EMrpPP1iFZ0/nddWHppOaxv2fyWtvezkdWltMbvqTu9A/pkXi/aXxHxjyNu/N6bSWi87xPJynUm1U7RxGsUek3NQbO9u0coJsU66xHzZe6rtNiHaOCVq45G3cQHz5e2eHktrZ3QM1J0+gHxbHxbbpuh2U/OpdTkU3WntMdY/J6h9JF9Svh8DerstEsfpvuS8BQD9yTYoy/WfU/v44Cz8c6HOCZPJZwjx2dR+p0yJ+VQb1b8d2TlB7asA8Je7/kn/QZOpf2ubrWvFOb+Gma/GjtgcEZtbtfzj1bIOEoA7AbwSwIdbuEwzMzNrA5XOUCMdot0AVlb9fkZl2m4AL6yZ/oUGlgNgFr5iIzlEcgfJa0luJ7mFZG9E7IiIu5q9PDMzM5sXPgnglyt3s/0EgP0R8T0AnwVwEckllYuzL6pMa8hsjSCtAvDaiHgTyX8CsAHA/5mlZZmZmVkRZfWla2uR/BhmRoKWk3wIM3emdQJARPw1gM8A+DkA9wAYB/D6Sm0vyasA3Fp5q/dGhLrY+5jMVgfp/ojYVnm9FcDQscxEciMq30/+5Qf+GL/6y6+dndaZmZlZW4kI+Y9+RASA30xq1wG4rpntma0O0mTV62kAvccyU/X3k628cMzMzGxeivxC8/nOt/mbmZmZ1Wjlbf6XAvgggBUAPk1yW0S8tFXLNzMzsxpljyBlOPOVXvv5t1Nemzbs4jvfl85314VvTWufmF5Ud/qdyDNgFrIzrZ2M+rlEANAbeZTFHWJ5n9+/M609Z+E5aW1pqX7Wy2Lk7VdZOypPROWQqIyPJ0V+0grWb/8C8X6HRDu6CmYMqaNBfbYxkVXTm2TVqBwqZVK0X+VGqeWp3JwHy+N1p59Wyr85V8vqEQPXKutIncbVfL1ieVmWk9pHsnyeo7VD7T9qu6ltkx0DgyKjalRkHamsJpURpnLAFJU/lLVF7VtqPSrqmFLnBHWeLNqWlucgfW9HyzoBnaee39LP1qhW5iDZLMk6R2ZmZkr4GqSUr0EyMzMzq+ERJDMzs/nK1yClPIJkZmZmVsMjSGZmZvOVr0FKeQTJzMzMrIZHkMzMzOarNnoWW7tp2w7SzT15XMJZIuvo3Fv+Iq39xq+/oe70t9yyNJ1nkVhFC8si60UkS/R05BklzxocSmtbD+xKa+f2nVZ3+ooFy9J59qk8FJGP1cH8c/eL9dXNfMDyiSQjqSSWtVRkPCkqh0dlK6k8mgXiPffEobrTVXbMIIsdmiqHp2hGTxYj8WA5z/PqE+1fyb60Rpkdk7e/2FzAeJJ/syhE5g/zd3wY9bc1oNfxRFoBekSmUZYVNC6WtVi837So7RdZXx0Ft436CqMzqU6I81a5YPaQyngqktU0Uzv+ZVl7aWWS9lUALsFM3tujAF4XEd9t1fJ/lGWdIzMzM8nXIKVa2ZW9OiLWRsQ6AJ8C8O4WLtvMzMzsmDW9g0RyiOQOkteS3E5yC8neiHiy6s/6oUe+zczMzE6Y2RpBWgVgU0SsBrAPwAYAIPk+kg8CuBweQTIzMzuxyuXW/cwxs9VBuj8itlVebwUwBAARcWVErARwPYA3185EciPJEZIj3xy9Z5aaZmZmZqbNVgdpsur1NJ56Mfj1qIwqVYuIzRExHBHDFwz+2Cw1zczMzICZh9W26meuadlF2iRXVf16CYCdrVq2mZmZ2fFoZQ7S+0mei5nb/B8AcEULl21mZma15uC1Qa3S9A5SROwCsKbq92uKvM8TIpTsE9OL0loWBgkAA391Xd3pZw7/YTpPd+TBY4+V8sCykggsU0GFK0q9ae0nBs9Oa1sPPFB3+trBPARzPPL2q1C7TlHLY+aAEPMdSgLXxspZ3BrQX1JLy2UBdIAOU1QRdGqd9LB+OyfE+lf7T3fBMDw1XKwCGnuSddIjwiAfnx5PaysW9KQ1tR6VBWK+SRHml63nHhFQuqycr8nHSurYyGvqll61vaeSWhS8SXihCMjcLzaNClMsKtsXVHDmmPh3Qyka3qjOJSpY1uaGtk3StmOXdY7MzMykOXhtUKs489zMzMyshkeQzMzM5is/rDblESQzMzOzGh5BMjMzm698DVLKI0hmZmZmNTyCZGZmNl85BynFiPbMavjVoV9IGzYWedZFhxgUO5P181feM/LH6TwHRK7SX99yRlrbw/zCtwmRy6KyUqbEfFkOyUe/97V0npeevC6tLS11pzWV46TyRNRny2oql+iRmExrKkdoUOT3qByeInk66j27xLoaQ77/qHYoarhYZctk1PbMcq0AYNf0aFrrL3WmtdOYZ4QdFvtJn/hsWTvV+ykroyutPcl8naj9XLXlUFIrmuel9uNFYj2qPVLty2ofGk0yjdT2VOtKfTZ1bBTNeMracrTMpQ/t+sdiYWAFTW7/XMs6Ad2rX9TSz9aoVj5q5D0kd5PcVvn5uVYt+0fdbIS0mZnZPBDl1v3MMa3+iu3PiiZrm5mZmbVK00eQSA6R3EHyWpLbSW4hxdi4mZmZWZuZra/YVgHYFBGrAewDsKEy/c0kbyd5Hckls7RsMzMzOxblcut+5pjZ6iDdHxHbKq+3AhgC8FcAzgGwDsD3AHygdiaSG0mOkBzZOXrfLDXNzMzMTJutDlL17UXTABZExCMRMR0RZQDXAriwdqaI2BwRwxExfJ54cr2ZmZk1LmK6ZT9zTSvvYju16tdLAdzZqmWbmZmZHY9W3sX2pyTXAQgAuwD8mvrjftG0Dqqsjny+7qg/n8o6Gvir69LaBav/IK3d1Z2341ulPMdJ9Vk7k1ongEhu9V+/fFX6frfsvyetrV+Uj+AtYp710isyhgbFtikn7Vc9eJX1ojKjVNZRuWCOU7OprKMpcbtsD/OMGLUui+RvqfWfbU8AOKmjL609PD2e1g525Nlc6rOp7X0oma6CM9S+pXJ4lpfzVu4v5fOp3LRseepqD5UH1CVqB8W79oktoPK+VPpWtjQVa6KOULWPT4isJkXlfWWVBS08jxyTOXj7fas0vYMUEbsArKn63bf1z7Ksc2RmZmbF+FEjZmZm89UcvLusVfywWjMzM7MaHkEyMzObr3wNUsojSGZmZmY1PIJkZmY2X5XnXj5Rq3gEyczMzKyGR5DMzMzmK1+DlGrbDtL503nTvtuRx4stLOchXI+V6g8l/vUtZ6TzqDDIF23/k7Q2fPnr09o77lqR1koi06gnHfBjGrj23M6T0/dbtyRvx2cP3J3WntF3WlpbyM60pgL2stBBFS45KEIpVYjhhIi8VyF0/SKEsVsMxmafWrVRhRt2iHaoz9bJvI37YiKtLU62qQowVO1XtWWlnrR29+En0lpfKQ8vPV08F3usQGafChx8gvn63y8Cboem8226uyOfr9mhg08iD7HtE7GOh8S+fEo5n+8g8/n2JB+tSKjpjLymwjPV/qrOF9mZcKGMx7R20rIOEsl/BHBu5dfFAPZFxLpWLf9HmQ83MzMrxDlIqZZ1kCLiNUdek/wAgP2tWraZmZnZ8Wj6Rdokh0juIHktye0kt5DsraoTwKsBfKzZyzYzMzNrhtm6i20VgE0RsRrAPgAbqmrPB/BIRDzlIheSG0mOkBz5krgGxszMzJogyq37mWNmq4N0f0Rsq7zeCmCoqvZaJKNHEbE5IoYjYvj5A/lT6M3MzMxm02xdgzRZ9XoaQC8AkFwA4JUA1s/Scs3MzOxY+SLtVKuDIl8MYGdEPNTi5ZqZmZkds1bnIF2GY7w4e+WhPE/kiZ78xvaePJYizbrYI7JL7urOV5HKOlp0/UfS2p5n/1ZaW1bqTmujKqMnudlf5ZMcFrXTu5emtS/t3ZnWLlv+7LQmNk26bQ7JrB2VPZTP1yNyhBSVlaLTV+p/8rJ4vyK5SgBwmHn1kLgGoEssL/vceS6XptZjn4j1OaNjYVrbUz6Y1g6W8j0vy9Q5AJEnJdqvHtqgcq8e7si3TZG9Ve0j/WK7UXw2tbXVuWRfKW/NQOTvmm0b1Y4esbai4LlQ1dR7Tkb92pg4Rk8IjyClmt5BiohdANZU/X5N1evXNXt5lneOzMzMrJi2TdI2MzOz2RUifX++88NqzczMzGp4BMnMzGy+8jVIKY8gmZmZmdXwCJKZmdl8NQcTrlvFI0hmZmZmNRhJVsOJ1tPztLRhrzw5D+JWGTdZbovKZZkSiSIq12RPeTKt/dM3/jytfXrNH6a1b/Tk7XwMU3Wni1gZDIh4gLOn89o5h+ovCwBetv+rae3lJ1+Q1k75wfOMf0iWhQLo3r2abxSH09reOJTWFrEzralMpixHRWUdqf1O7a8qz0hR6yQ7blT71bFRdNso6v+BHy6Pp7VTSn11pxfNeFKfW62vcZGgpD7b06On7vT9Imtnv1jH6l8Dlf+kqHWpMoay/XxMrCu1b6maorKOih5v6jP81a5/KtbQgg5+bnPLOgG9L9rY0s/WqJaNIJF8FsmvkbyD5L+RzFPf7LhknSMzM2svqnNk7aWVX7H9DYB3RMQzAdwA4PdbuGwzMzOrFeXW/cwxTe8gkRwiuYPktSS3k9xCshfA0wF8sfJnNwHY0Oxlm5mZmTXDbI0grQKwKSJWA9iHmc7QdgCXVOqvArBylpZtZmZm1pDZ6iDdHxHbKq+3AhgC8AYAv0FyK4BBAE+5GpbkRpIjJEempw/MUtPMzMwMwExQZKt+5pjZykGqvoVrGkBvROwEcBEAkHw6gP9eO1NEbAawGdB3sZmZmZnNppYFRZI8KSIeJVkC8IcA/rpVyzYzM7M65uDF063SyrvYXkvy2wB2AvgugI+0cNlmZmZmx6xtgyJ/4cxXpA378v670/meNTiU1laU6ocRLmNXOo8KflM1FfT3sol8ef/9zj9Oa7ete1ta+2xHf93p93AinUeFnK1AHorYG3nWl1re50fz7fbs/jPrTj8l2WaADq6bKrhtVJjceOT5JeooWsj6A7Uq8LHoZ1P75KT43EVCDPtE0KhKg1tQMMzvgMiPKbq+9kT9QNdl7E7n6RXrqmgYoWqjkn3us6fzLwce6MjX4yGxj6g2qn1L7SdKV/LZ1L6qMoZUG4uGr6rjLZtLhWMCwF+2Oijyxr9oXVDkf3urgyKttbLOkZmZmRXjh9WamZnNV3Pw7rJW8QiSmZmZWQ2PIJmZmc1Xvost5REkMzMzsxoeQTIzM5uvfA1SyiNIZmZmZjXadgRpscgmes7Cc9La1gO70tpPDJ5dd/qUWA2dog/ZI2qjIuviGz15FMQZIuvoWdv+V/3pAA782hvq1t62dVn6fiqfRGUdqcyQfrEu1/Y/La3dMnpf3ennD5yRv1/HkrS2H4fT2njkNbW9FzHPhlL5N48lWTsqj2kVi0U39Iv2h9je46Itg8k2zTKEAP3ZTmdfWlNU5ozKVlK5RVne0cPlg+k8p4lsLpXRo6hzyYRYl9l+fndHvq5WRH6MTjFvx2OYSmsqh6pcMLernLzngNiPF4vzj2qH+mxqX1a5UUzar/bHE8LXIKWauqVIvorkdpJlksNV05eR/E+SB0h+qJnLtLxzZGZmZsU0ewTpTgCvBPDhmukTAN4FYE3lx8zMzE40X4OUKjSCRHKI5A6S11ZGjLaQ7I2IHRFxV+3fR8RYRHwZMx0lMzMzs7bWyFdsqwBsiojVAPYB2NCcJpmZmZmdWI10kO6PiG2V11sBDDXaGJIbSY6QHNmZXLRrZmZmTRLl1v3MMY10kKpvYZlGE65niojNETEcEcPnJXecmZmZmc22tr3N38zMzGaZL9JONbWDRPJSAB8EsALAp0lui4iXVmq7ACwE0EXy5wFcFBHfyt5L5cosLdXPLgGAc/tOS2tbDzxQd/qLB5+ezrNAZGeoNvaLrA6VufHZjjz/5hxxO//Ah6+rO33l8LvSeZTHOZ3W1OdWmSFqu10wOJTWto89VHf6eYOL03lU1pHKXsmTjnR+ySGZ51K/drCc7wcHO4qdtKbFtlFUjk1WOZU92JPsywfK+foPqmMqX8dLxdZRGTd5Jc8tWiRy2LJcKwA4hT1pTWUdFR3Kz9o/hUi324RY/0vLeUseF41U5wR1vPWo82S2nsUuvlT8k9Yf+QfYJ/Kf1DlNieRzj2Na5sVZ+yi0lSJiF6pu14+Ia6rKNyTzDBVZlh1d1jn6UZB1juzEyzpHduIV6yZbK7Rd58gjSKk2i/Q0MzMzO/HarCtrZmZmLRPqS+j5zSNIZmZm1hZIXkzyLpL3kHxHnfqfkdxW+fk2yX1Vtemq2icbbYtHkMzMzOarNroGiWQHgE0AXgLgIQC3kvxk9Q1dEfE7VX//FgAXVL3FwYhY16z2eATJzMzM2sGFAO6JiPsi4hCAjwO4RPz9awF8bLYa4w6SmZnZfFUut+yn+mkZlZ+NNa05HcCDVb8/VJn2FCTPBHAWgM9XTe6pvO/NlTihhvgrNjMzM5t1EbEZwOYmvd1lAP5vRFSH9p0ZEbtJng3g8yTviIh7iy6gbTtIi0XTVCjfigXL0trawaV1p2/63pfTedYvX5XWntt5clpTbVQZJfdwIq29bWvy2YZ/HytRP6DuXSNXpe83+qbXp7XrR1amte+KEMNSwfDMvlL9gMxTBvP1/5FHv57Wfnb5mrSmAiv7RBvVNlVBi6cm4YHljjxU8InIM4ZKzJc1KI4bFdinghazMEIV3Li4lNcmkIeQjiIPmKRYx1kbAR3QmG23ZSIocrH43A+Wx9LaQvGeS0VN7Vtqu2X2inU8WsqXdXrkn/uACJ+cEEGLqraY9Zen9uN9Yt/ay/xzLxfbVLVxUgYJ16fOIydEez0jbTeA6n98zqhMq+cyAL9ZPSEidlf+ex/JL2Dm+qTCHaSmfsVG8lUkt5Mskxyumn5h1ZXlt1USt61Jss6RmZnZHHIrgFUkzyLZhZlO0FPuRiN5HoAlAL5WNW0Jye7K6+UAfhJA+rSOY9HsEaQ7AbwSwIfrTB+OiMMkTwVwG8l/ixDPgzAzM7PZ1UZ3sVX6CG8G8FnMDMJdFxHbSb4XwEhEHOksXQbg4xE/FOJ0PoAPkyxjZvDn/epxZseiUAeJ5BCAGwF8GcDzMDMEdklE7KjUf+jvI2K86tce6McjmZmZ2TwUEZ8B8Jmaae+u+f09deb7KoBnNrMtjXzFtgrApohYDWAfgA3qj0k+h+R2AHcAuKLe6FH1Fe7bRu9poGlmZmZ2VBGt+5ljGukg3R8R2yqvtwIYUn8cEV+vdKZ+HMA7yadeuRoRmyNiOCKG1w3+WANNMzMzMyuukQ7SZNXraRzj13WVr+EOAMhvMzIzMzM7gVpymz/JswA8WLkA60wA5wHY1Yplm5mZWaKNLtJuN03tIFVu3/8ggBUAPk1yW0S8FMBPAXgHySkAZQC/ERGPq/dSeToqR0XlYIxH/dpLT84f3XLL/vxaqHVLVqS1w+I69CUFs2qyjJ5RTGMwq4mso8FrP5LWVq9+yjMCv6+nM89suWVBsaygLKtGZdisW3J2WrvtwANpbf3AUFrrEBlJAyIjSWcM1ac+2/60Akwk+zEAdIqMJJUjpNrfn8ynjlGK95sSNfXZepiv/yJ5QDPz1XdIZt/kNZV19Gj5YFob6MjPCepckp0T1FcDKtdnXJw/D4r1vyjyJZZFRtK02IfUftJs42KdqPNWnp6U5yAdFMuy9lKogxQRu1D1FVlEXFNVvqHO3/8DgH8osiw7uqxzZGZmJnkEKeVnsZmZmZnVaNtHjZiZmdksa69HjbQVjyCZmZmZ1fAIkpmZ2TwV5bkX4NgqHkEyMzMzq+ERJDMzs/nKd7GlPIJkZmZmVqPZQZGvAvAeAOcDuDAiRirThwDsAHBX5U9vjogr1HuNicAyFZw2JR6I15EEfi0V4YDrF+VhhJ89cHdaO717aVq7vHRqWnuoIw8l64289jjrr6/rR1am86gwyOdvf39aW/fGPHxy5LaT0lqn6I93JdtmgQhpG+7Ml/UcUfvUWB7+eWHf09LaqAi8U7qSz90v1kcn85paJ6NPfQb096n/G1osAg6zYLvseAJ0CGa3qE2J2gHx2QaYn8rU8tRnyKj1qMIsl5We8vjJ79sbh9Jatv8AeTCoDvHMqXDGMRFwOCGOjeWRr5MpMV+2D6k2qu2pwlCLhlKeJD5btrbEafzE8F1sqWZ/xXYngFcC+HCd2r0RkUdWW2FZ58jMzMyKKdRBqowI3QjgywCeB2A3gEsqD6IFxeMOzMzMrE34LrZUI9cgrQKwKSJWA9gHYMNR/v4skt8k+V8kn9/Acs3MzMxmVSNfsd0fEdsqr7cCGBJ/+z0AT4uIPSTXA/hXkqsj4snqPyK5EcBGAPiZpeuxZvCcBppnZmZmku9iSzUygjRZ9XoaorMVEZMRsafyeiuAewE8vc7fbY6I4YgYdufIzMzMTpSW3OZPcgU5c3sHybMx8/Xcfa1YtpmZmdnxavZt/pcC+CCAFQA+TXJbRLwUwE8DeC/JKczc/XhFROxt5rLNzMzsOPkrtlShDlJE7AKwpur3a6rKN9T5+38G8M/Hs4y9MZXWekRGTIe4g64zychQOSOLRD7MM/pOS2tf2rszrb27f3la29OTb5Is2+SkWIA9ya3+3+3Id/6ezvyzqayjwb/9SFrbt/5taW2F2G5ZCowKMAiRXZIn5gCLO/vT2n/s35HWfm7x6rRWZCj2UME8F5Vk01fwBtIJsaZ7UD/rpWiuTHYcAsACcfz2idPVYZF/pu6qnUjSavTaz6tqP1DZVouTdQwAu8vjaW15cn5S/+SVC2b+KOo9x0XWUZ9YYyp3KXNIzFO0G6D214eZn2lOivr766g8q1k78aNGfgRknSMzMzNJ/M/FfOdHjZiZmZnV8AiSmZnZfOVrkFIeQTIzMzOr4REkMzOz+cqPGkl5BMnMzMyshkeQzMzM5qvwNUiZtu0g9TLPBVHDXv3iI2XveFhkePQyf7+F7Exrly1/dlp72cNfTWv/T++FaU19tqkk5SPLTgKAWxbkn3vktpPSmso6+j9b/1da+8/Vf5DWPtdbv517kOdhLRTro1fsJa9dsDKtre0+Ja299LtfTmuXnfqctLY02U9UvsqgyMVR8z0pMlbGRa1PLG8y2bdUO1RN5cD0inY8GXnmjMotUhlPmUF5rOXHjcqGKur0Ul9au7s8Wnf6Ynan86gcuR5x3GT7AQD5qQ+K+UbFNl2N+p/7oMhVekycL9R+sBj5uVxlPKk965EkI0kdG9ZemvoVG8lXkdxOskxyuGr65SS3Vf2USa5r5rLns6xzZGZmJpWjdT9zTLOvQboTwCsBfLF6YkRcHxHrImIdgF8CcH9EbGvyss3MzMyaotBXbCSHANwI4MsAngdgN4BLImJHpa5mfy2AjxdZrpmZmTVPOAcp1cgI0ioAmyJiNYB9ADYc43yvAfCxBpZrZmZmNqsa6SBVf022FcDQ0WYg+RwA4xFxZ1LfSHKE5MjO0fsaaJqZmZkdla9BSjXSQZqsej2NY/u67jKI0aOI2BwRwxExfN7g2Q00zczMzKy4lt3mT7IE4NUAnt+qZZqZmZkV0ezb/C8l+RCA5wL4NMnPVpV/GsCDEeHvzszMzNpBlFv3M8cUGkGKiF0A1lT9fk1V+YZkni8A+IljXYbquT0ZeRhYtwhBiySgq0MG9h1/OOPMsnIvP/mCtPb50bvT2tr+p6W1paX6wXD9BQMHO8UWWCHWsQqD/Jntf5LWFq79vbrTP9HVk87zCA6ltUPic3eU8s99a08eGPeqU388rX3lwL1pbW1//WDKodJAOk/eeh28p0JPi4RBAsDBJMxvMfNt0y32rQmxb6lQvn4RHquofXkUWVBhHmCogiLV+aIs1ol6T3UuPKnUW3f6w+XxdJ7T2S/esZgu0UrVfoog3n1JDOOZ0/l+MN4hjvuCAY3qmFLBmtk2Ve9n7aVtk7Tt2GWdIzMzM2kOXjzdKn5YrZmZmVkNjyCZmZnNVw6KTHkEyczMzKyGR5DMzMzmK1+DlPIIkpmZmVkNjyCZmZnNV3Mwn6hV2raDpHN48tvanxAZSYeSrJeVrJ8lAuhclmmZXZJnbpwilvfs/jPT2i3i+XQXDA7Vnd5XyjNPVIZHl2h/nj4EfK43ny/LOgKA9bdfU3f6ub/+hnSet926LK2podGByNvYJ84VCzvyjKTV/WektZHR++tOLw+elc7zjNJgWhtL8mEA4NHywbTWKfKrThP7ZCfrr689yI81tf77C5521DlBZdxkxz0ALEP9bfq9mEjnmYh8/S8q5Z9NnROKnogXJdlWpVJfOs8TMZnWekRLFjPf/4slVOlteig5v97dkWdUDRbMfdsvcq/UF1BdopadX1XmlbWXZidpv4rkdpJlksNV07tIfoTkHSRvI/nCZi53vss6R2ZmZpIfVptq9jVIdwJ4JYAv1kx/EwBExDMBvATAByrPZjMzMzNrO4VGdkkOAbgRwJcBPA/AbgCXRMSOSr12lmcA+DwARMSjJPcBGAaSVVHfAAAgAElEQVRwS5Hlm5mZWePCOUipRkZxVgHYFBGrAewDsEH87W0AXkFyAcmzAKwHUP8BVWZmZmYnWCMXad8fEdsqr7cCGBJ/ex2A8wGMAHgAwFeBp15pSnIjgI0A8MKl67F68JwGmmdmZmbSHLw2qFUaGUGqvhViGqKzFRGHI+J3ImJdRFwCYDGAb9f5u80RMRwRw+4cmZmZ2YnSkgulSfaR7K+8fgmAwxHxrVYs28zMzOx4NTUHieSlAD4IYAWAT5PcFhEvBXASgM+SLGPmgu5fOtp7qcyKvAKUkswWABgr189tmWZP/n5iWYNi9ansFaqMpFKeR3P+QP2snYk4jHvHH67/foOr0vdTOUgLRBvzFBidjfOJrnw9Z3lHA391XTrPyuF3pTWVX7WH+SeYLOXrROXYnCS223MW1h8NvWvikXSes3sH0tpo5JktHQVvDlX7ZJYxpPKA1PrvZZ5Vo7LFFLm8gvt5ZlIcATobLdcj8nvUfFmmjnq/XnHeenD6ybQ2uGCpaInKeCqWUZWtSXVJ8aSoDkS+JveJ3UBlbKntne2TXSAOt1MWkr9iSxXqIEXELgBrqn6vTvm7Ifn7c4ssy44u6xyZmVl7aavOkUltm6RtZmZms8yPGkk5rNHMzMyshkeQzMzM5itfg5TyCJKZmZlZDY8gmZmZzVPhEaSUR5DMzMzMangEyczMbL7yCFKqbTtIOoArtxSdaa2/VD887ZGYrDv9aO0YZL76OsXgXI8IHlMBmWs7ltSfPrgEh5J2fuTRr6fvt27J2WltuPOktBZinSwUu9QjOJTW3nbrsrrTVRjku0auSmtjv/nGtPa3Xzs9re0t5XuXCiNcLva7paxfO613KJ1n03e/lNZecvLavB0isHJA7K9T4qjKAjJXsFvMk3si8jBRRbVfGRXBjlmIofpsqqaCCouGx6p1mR1vap7l7Epr3QsWp7WHyuNpbTDZxwFgqVieameRm89VUO0+ESJ8VuTbNDu3AsAB5q3MQjx9U/3c0dSv2EheTXInydtJ3kBycWX6MpL/SfIAyQ81c5mmD2AzM7NUudy6nzmm2dcg3QRgTUSsxczDaN9ZmT4B4F0Afq/JyzMzMzNrukIdJJJDJHeQvJbkdpJbSPZGxJaI7z8o6mYAZwBARIxFxJcx01EyMzOzdlCO1v3MMY2MIK0CsCkiVgPYB2BDTf0NAG48njckuZHkCMmRO0fvbaBpZmZmZsU10kG6PyK2VV5vBTB0pEDySgCHAVx/PG8YEZsjYjgihtcM1n8CupmZmTWJR5BSjdzFVn3r1zSAXgAg+ToALwPwooiYe2vEzMzM5r2m3uZP8mIAbwfwgojI7wk1MzMza2PNzkH6EIBuADdxJnPi5oi4AgBI7gKwEEAXyZ8HcFFEfKvIQrpEZkgRWc4LoPNhdFZTPl8/6ucxAcCEmG8/Dqe18ahf+9nla9J5bjvwQFp7jshBylsB9IpvbQ+Jz53NpbKHVNZR/6a/TWtrV78zrd3blee5PNKRt2VStLMv+XQlsa7WLcszqu4YezCtrR8YSmudzJfXIXN4jn8guFt8NnXcjImMpJLIsSmLweoe5vtdV9JOlUemrksYF5lLU7KNKhstX+LhZF1mGTyAbqPaNktLeVbQY+WDaU3lxanlLUuyxVSsyaTYburcqtaXyq1Ty8sqalkngr/oyRXqIEXELgBrqn6/pvLyPWKeoSLLsqPLOkdmZmZWTNsmaZuZmdksm4MXT7eKH1ZrZmZmVsMjSGZmZvOVR5BSHkEyMzMzq+ERJDMzs3kqPIKU8giSmZmZWY22HUE6KDIrVEZJj+jzZXkiKqdDLWsi8jwRlb0yKpKEVC6Iup0/m09ll6jMnE+N3ZPWFnf2p7XXLliZ1jpK+bociPq1PczX8d9+7fS0prKOXrj9f6S1Cy5/fVobuWtFWguV7ZPkziwUuVA/2Z1/tqnuU9Pav+y7I61dMDiU1s7qGMyXJz7bguT4UPOoPKYV7ElrKqtJlcbEcdqbtCVPY9LnBJVZRJF19KTIf1Lnp57kFN4BytyfTJYLdTSLmZ9nHhYZSV3iPLmCXXWnq2w0lb91SKyPJ8R5RuXkrSzn7d/P+u3sR0kur+U8gpRq6ggSyatJ7iR5O8kbSC6uTL+Q5LbKz20kL23mcuc71akymy1Z58hOvCKdI2uNtuocmdTsr9huArAmItYC+DaAI/8bfyeA4YhYB+BiAB8mxf8WmZmZ2ewrt/BnjinUQSI5RHIHyWtJbie5hWRvRGyJ+P73QDcDOAMAImK8anoP4CEPMzMza1+NjCCtArApIlYD2AdgQ039DQBuPPILyeeQ3A7gDgBXVHWYzMzM7ASIcrTsZ65ppIN0f0Rsq7zeCmDoSIHklZh5pun1R6ZFxNcrnakfB/BO8qlXY5LcSHKE5MjO0fsaaJqZmZlZcY10kCarXk+jckccydcBeBmAy6POY4IjYgeAA6h62G1VbXNEDEfE8HmD+dPMzczMrAnK0bqfOabZd7FdDODtAF4REeNV0886clE2yTMBnAdgVzOXbWZmZtYszb6T7EMAugHcVMn8uDkirgDwUwDeQXIKM9ey/0ZEPN7kZZuZmZk1RaEOUkTsQtVXZBFxTeXle5K//wcA/3A8y1CBXyr355CoZfOp4LeyaIcKw1P2xqG0tjQJRwPyELpOsaw+EUbYIUIkL+x7Wlr7j/070tra7lPS2q09eUv7kltAJ0v5+t9byu8bvbcrX5YKg1x0/UfS2r71v53WukTAYbaXjIv7XotmW53aszSt3fzE3WntnOXr01opacuUaL/c78TxRlFTx5saCu8QAY3ZJ1DH1HgS/NkIFSyrPnfWFhVuqO62zluhQzAXMV9jqrZrejStTXX01Z2uQllViKTa74p++bOnlM/Zl4TfFv13Y9bMwdvvW8WPGjEzM7O2QPJikneRvIfkO+rUX0fysarw6V+tqv0KybsrP7/SaFsc1mhmZjZPtdPt9yQ7AGwC8BIADwG4leQnI+JbNX/6jxHx5pp5lwL4IwDDmBkU3FqZ94mi7fEIkpmZmbWDCwHcExH3RcQhAB8HcMkxzvtSADdFxN5Kp+gmzDy5ozB3kMzMzOar9nrUyOkAHqz6/aHKtFobKs98/b8kjzwh/VjnPWbuIJmZmdmsqw6DrvxsLPA2/wZgqPLM15sAfLS5rfwBX4NkZmY2T7XyGqSI2Axgs/iT3QBWVv1+RmVa9Xvsqfr1bwD8adW8L6yZ9wsFmwrAI0hmZmbWHm4FsKoSLt0F4DIAn6z+A5KnVv36CgBHcmc+C+AikktILgFwUWVaYW07gjQhskZ6RFqHysHIUjAmxZejKjujX2SXqBwSlcsyHvnnVnkivUlfV+VCDYj1OMp8vp9bvDqtvfS7X05rrzr1x9Pawo76n03nueRtfKQjr43ctSKtqayjj23932ntE898V1q7tbv+/rUX+fOaVQ5Yj6hd2j2U1tbizLT2i49+La29fMWz6k5fxjxHS+UZnYw860vlP6ljcb9Yl5PiudhTrL9txkU7VMaTonN4iv1fvDo+MkXX/6g4J6tWjIn5zuoYTGs7y0/Wnb6ilGeOqX8b1HGjsokmxL8Par4HOFV3+qJ2+2e3jXKQIuIwyTdjpmPTAeC6iNhO8r0ARiLikwDeSvIVmHne614Ar6vMu5fkVZjpZAHAeyNibyPtaeqWInk1gJcDOATgXgCvj4h9JIcw08u7q/KnRxK2rQmyzpGZmdlcEhGfAfCZmmnvrnr9TgDvTOa9DsB1zWpLs/9lvQnAmsrFU9/GD3+IeyNiXeXHnSMzM7MTLMqt+5lrCnWQSA6R3EHyWpLbSW4h2RsRWyK+P559M2YukjIzMzObUxoZQVoFYFNErAawD8CGmvobANxY9ftZJL9J8r9IPr+B5ZqZmVkztFcOUltppIN0f0Rsq7zeCmDoSIHklZi5gOr6yqTvAXhaRFwA4G0A/l+SC2vfsDojYefofQ00zczMzKy4RjpIk1Wvp1G54Jvk6wC8DMDlEREAEBGTR7ILImIrZi7gfnrtG0bE5ogYjojh8wbPbqBpZmZmdjS+BinX1Iu0SV4M4O0AXhER41XTV1QeQgeSZ2Pm6zkPEZmZmVlbanYgw4cAdAO4iTNZP0du5/9pAO8lOYWZbyKvaDSfwMzMzGy2sPItWNv5jaFXpw07KILHFohBsc4kzkytARWAtkCGGOZkGJsItVssgiIz2Wc+ajtE8J4KvJsQ46hfOXBvWlvdX/+Gx5NKvek8y5Gvj0nx2VQo32FR+9nJfHmX3HFVWrvz2b9Td/q/Mw/Jux0H0toS5kF/ap10ih39NoymtRsfu73u9OcuOzedZ2XHQFobLPj/ZSrQVVFzZWGpKgBQHVOqjep8UXR52Xz7o35IIQCcLAM+c/lZVwf7Fg17zewuj6c1FSKp/m1QWXJFz+XZueRoQaN/vuvjx5/+2YDHX/qClnUCln/2v1r62RrlhEEzMzOzGm2WeW5mZmatMhcvnm4VjyCZmZmZ1fAIkpmZ2TzlEaScR5DMzMzMangEyczMbJ7yCFLOI0hmZmZmNdp2BKm7YN9tTxxKaz2snz+xqOBqUB1vle+hsnYWMm/LYzGZ1rLlnco8F0S1v6vg+l8qsprW9q9MayOj99ed/pyF5xRaVp9o/5jIbFGBILd252vsnCTrCADWfOPP6k4/802vT+d56zeWpTV1bCwq5zEj6rOdJPJjfmb56rrTbz/wnXSe6b5T0traBflnGxP5W2MiI6wrObYBfXxPJEeByhHqZr7+F4ocKpWZo7KOivwP/iJxbDwYeY5Qh9i3VH6SaqM6k6iMpJ5kztNLfek83y0fTGuLRX6Y2qaq/Sq/Kp+nzYZsYk5FE7VUsx81cjXJnSRvJ3kDycWV6ZeT3Fb1Uya5rpnLns+KhK2ZmZlZrtlfsd0EYE1ErAXwbQDvBICIuD4i1kXEOgC/BOD+iNjW5GWbmZnZcfDDanOFOkgkh0juIHktye0kt5DsjYgtEd8fB78ZQL3nR7wWwMeLNtjMzMxstjUygrQKwKaIWA1gH4ANNfU3ALixznyvAfCxBpZrZmZmTRBltuxnrmmkg1T9NdlWAENHCiSvBHAYwPXVM5B8DoDxiLiz3huS3EhyhOTIHaP5g03NzMzMZlMjHaTqW6qmUbkjjuTrALwMwOURUXv18GUQo0cRsTkihiNi+JmD+d1LZmZm1jhfg5Rr6m3+JC8G8HYAL4j44XtJSZYAvBrA85u5TDMzM7Nma3YO0ocAdAO4iSQA3BwRV1RqPw3gwYi471jeqEPkY6jsDJXfMxH1829WiHwMReWalGX7i92Wr/IzDpbr57aUO/J8myxnBAD6Re1QwTyXodJAWisPnlV3+l0Tj6TznNY7lNZKov0LkWfmjIt1vFdk9Pw7B9Nalnc0eO1H8nmG/zCt9YjcksdLefvVcHGWBwQAK5KMpPUDQ+k8t4/vTmvnDSxJa6Mi62ha5ceIQ4oiE2gqycQ6KNox+pSB8R/oLeX71gJxbCjqPJOdJ9X5s1ec9p8UOXKHxXlS7VvqnKByhLL5BkX7B8W2flRkJC3qyOdTuXV94lySOSBy2Ky9FOogRcQuAGuqfr+m8vI9Yp4vAPiJIsszLescmZmZKeGgyJQfNWJmZmZWo20fNWJmZmazay5ePN0qHkEyMzMzq+ERJDMzs3lqLgY4topHkMzMzMxqeATJzMxsnhKpFfOeR5DMzMzMavCpTwNpD28eek2hhpVFqFcWMKmC2CZFOJ0KQOsWfU/1nip4rEss72Dynk9EsYykTubtVyF0gwWC04B8XU6IbbPpu19Ka+uWnZ3WfrL79LSm9gVlT0ymtY5kXziTeYjne0b+OK2NveWNae2jX8k/28MiRHJMhNdl21tduaDe7+8fuSWtvWjFmrS2hN2ilgf9KUw+RdH/c9yH/HibFLcLDTIfzFfnkuy4V/Oo81bRbaoCH9W6VOeS7FxY9KYrdWzvKh9Ia/1i31omwjOzpR3tip+/3PVPLb0o6IFnv7hlnYAzv/Efc+qCp6aOIJG8muROkreTvIHk4sr0LpIfIXkHydtIvrCZy53vspOkmZmZFdPsr9huArAmItYC+DaAd1amvwkAIuKZAF4C4AOVZ7OZmZnZCRJltuxnrinUSSE5RHIHyWtJbie5hWRvRGyJ+P5DjG4GcEbl9TMAfB4AIuJRAPsADDfaeDMzM7PZ0MgozioAmyJiNWY6PBtq6m8AcGPl9W0AXkFyAcmzAKwHsLL2DUluJDlCcmT76L0NNM3MzMyOJqJ1P3NNIx2k+yNiW+X1VgBDRwokrwRwGMD1lUnXAXgIwAiA/w3gq8BTr/iLiM0RMRwRw6sHz2mgaWZmZmbFNZKDVH3bzjSAXgAg+ToALwPwoqjcIlf52u13jvwxya9i5holMzMzO0Hm4rVBrdLUoEiSFwN4O4AXRMR41fQ+zEQKjJF8CYDDEfGtZi7bzMzMrFmanaT9IQDdAG4iCQA3R8QVAE4C8FmSZQC7AfzS0d5oSty6XvSm9u4kgULlEk2J7JIO5pk/qo1ZHhOg80TSdoBpxkeJ+bImIs81WSDTOvKaylhRcQRZxsro96/5f6qXnLw2rd0x9mBam+o+Na0pPeIb6SUiDyXLpOmJfF2prKP+D/5tWlu1+g/SWqkrP9zv6ci3TdbKXrE+1D7+rCVnpTW13dYPDKU1lR+m8m86C1xloLJ7xsUxNS72ZZU7pujjtL6iWV+KOk/qTLVc9o6HxHnksNzW+bpaVsozyZ4sH0pr8vyanNPU/mPtpVAHKSJ2AVhT9fs1lZfvEX9/bpFl2dHNxgnPzMx+9IX4H7X5zllEZmZmZjX8sFozM7N5Snw7Ou95BMnMzMyshkeQzMzM5qmyr0FKeQTJzMzMrIZHkMzMzOYp38WWa9sOksoTGWTe7Gbf8t4jso5UjtBh5le+LURnWlMZH/3pgB+TxA1gUGziTpHhofKH+sTx9GTaEp1R8mj5YN3pHSJDZXmpN62pzJx/2XdHWju1Z2lau7Q7f8/DYj9ZlCTVPl7Kt/VHv3J6WlNZRy/Z/idp7dmvfENa+5PvnJzW8hQYkX0jsl4u7MqXxa5T0tqNY/ektbV9p6W1fubHG5N9MmSeTr6t+8R+oM4le8oTaW2hyNhS58JMh/jioOj5s2iOk8qhKtIWtd1KYlnqPFkSH21v5EfHQXEOPac0kL+ptY2mfsVG8iqSt5PcRnILydMq088j+TWSkyR/r5nLtDoPtTMzs7bUbp2jKLNlP3NNs69Bujoi1kbEOgCfAvDuyvS9AN4K4Jp0TjMzM7M2UaiDRHKI5A6S15LcXhkt6o2IJ6v+rB/AkYfVPhoRtwKYakKbzczMrAkiWvcz1zQygrQKwKaIWA1gH4ANAEDyfSQfBHA5fjCCZGZmZjZnNNJBuj8itlVebwUwBAARcWVErARwPYA3H88bktxIcoTkyN0H7m+gaWZmZnY0vgYp10gHabLq9TSeekfc9aiMKh2riNgcEcMRMbxqIH/it5mZmdlsaupt/iRXRcTdlV8vAbCzme9vZmZmzeMk7Vyzc5DeT/JczASkPADgCgAgeQqAEQALAZRJ/jaAZ9Rc1G1mZmbWFgp1kCJiF4A1Vb/L2/cj4mEAZxxXw0SIYUmE0Klwsez7RPU9o6qpcLRD6hHJosM+KcL3IgmoKyGP7FPrg6IhRb97HRepTH0iYK9I0NyACMlT73fB4FBau/mJu9PaWpyZ1u7oztdltgXUJ35YhEiWuvLPrcIgl/3LdWlt7/o8nmxhup6P/zMDwAIxnwoTPblrUVr7yv48RPKixeentSxYcEIcvx3i3NQj9vEpcWyrMEgVftiRrEt1jsxbCEwVDIrM2gHo9uvz0/Er+mB6dSyq9+wX56BHy+N1p+/1zdxzRtsmaduxK3pSMDOz+c2PGsn5YbVmZmZmNTyCZGZmNk/NxQDHVvEIkpmZmVkNjyCZmZnNU77NP+cRJDMzM7MaHkEyMzObp3wXW47RpldoXbTy4rRhP9axsNB7diYDZiqLQ+V7PBwTaa1LDM6pjJ5uMZ9qS2dSU7lEKvNEtWNCvKfKgVEZTwPJfCqrSeXKqM+WrStA58f83aO3pLWLVzwzrZ3EnrrTJwqsD0CvE5U5szfy/JWPbM2jzLasvrLu9K/25u0YFfuIiqXoEp/tlMj/f+7pk/m7vvqJL6a1S08Zrjt9BbvTecoFjxt1/O7H4bR2SKyx7D1VO1T7+8V+p/ZXdQ5tNnWMqvarNqp9Uh1T6vya/RugcsAA4C92/WNLeyzffNolLdt4F3znE3OqN9bUr9hIXkXydpLbSG4heVpl+iVV00dI/lQzlzvfqX/wzczMMhGt+5lrmn0N0tURsTYi1gH4FIB3V6Z/DsCzKtPfAOBvmrxcMzMzs6YpdA0SySEANwL4MoDnAdgN4JKaZ6v1o/LEgYg4UG+6mZmZnTi+iy3XyAjSKgCbImI1gH0ANgAAyfeRfBDA5fjBCBJIXkpyJ4BPY2YUyczMzKwtNdJBuj8itlVebwUwBAARcWVErARwPYA3H/njiLghIs4D8PMArqr3hiQ3Vq5RGnnowIMNNM3MzMyOJoIt+5lrGukgTVa9nsZTv667HpVRpWoR8UUAZ5NcXqe2OSKGI2L4jIGVDTTNzMzMrLim5iCRXBURd1d+vQTAzsr0HwNwb0QEyWcD6Aawp5nLNjMzs+Pja5ByzQ6KfD/JczETK/EAgCsq0zcA+GWSUwAOAnhNHCWA6YyOgbT2YHk8rS0t5fklPcm14Vk+EqCzdhazM62prA61O46JXI3BZHNNIdL8GJWH0i9aclB87qJZRwcjz3rpZP22qOwYtY5L4j4AlZGk5nv5imeltU8+ti2t/czy1XWnryjVz0cC9OdW+88hUVvI/HDPso4A4KLt76s/HcCO4d+qW/vXyLPK7sbBtKYywnpF7fbufK1sSLKOAOAL+79dd/rwwrPTec4o9aU1ZVRkHamsHTXMXyTvSB036qSszpP5nqzPJSqiJJtPnZPVcaNqRam8u8xh36M0ZxTqIEXELgBrqn7PU+Zm6v8TwP8ssiw7OhWuZzZbss6RnXgqDNKsmveUnJ/FZmZmZlbDHSQzMzOzGn5YrZmZ2Tzli7RzHkEyMzMzq+ERJDMzs3lqLgY4topHkMzMzMxqeATJzMxsnspTpaxtO0gDIoyws9Sb1h4sj6W1niQobyXz4LdpkRIxIcMU88G5PvHZVCbFnphMa12s/55LUSzMUoWqqXWigt8WM4+T24OputMnIg/OXME8FFRZINqoQuiWieU9d9m5ae32A9+pO339wFA6z5JSvt165cCvOt3ln/urvXltZZJ3dP7In6fzPO0tb0xrb/nqkrSmjvs+8VVAt6gNiHX5jIEz6k6/Zf896Tx7B05Laxd2npTWVEDpaNTf/49GhdVm1HlLhVn2F/znQp0TVNBiFqio9n51jlwg5lwi1qMKv1VBndn29hdac0dTv2IjeRXJ20luI7mF5GmV6S8kub8yfRvJdzdzufNd1jkyMzNTAmzZz1zT7GuQro6ItRGxDsCnAFR3hL4UEesqP+9t8nLNzMzMmqbQmCnJIQA3AvgygOcB2A3gkoh4surP+uEUczMzs7ZV9r/SqUZGkFYB2BQRqwHsw8wDaUHyfSQfBHA5fngE6bkkbyN5I8m6T+8kuZHkCMmRO0fvbaBpZmZmZsU10kG6PyKOPMJ8K4AhAIiIKyNiJYDrAby5Uv8GgDMj4lkAPgjgX+u9YURsjojhiBheM3hOA00zMzOzoymDLfuZaxrpIFXfLjCNp35ddz0qo0oR8WREHKi8/gyATpLLG1i2mZmZ2axp9l1sq6p+vQTAzsr0U0iy8vrCynL3NHPZZmZmdnza7S42kheTvIvkPSTfUaf+NpLfqtwx/zmSZ1bVpqvulv9ko+um2TlI7yd5LmbCWB4AcEVl+i8A+HWShwEcBHBZRMhLw7IMDEDn9/QlWUcA8Pj0eN3pJy/I83nKBTN/FJUjpN4xy+iZijImo35tsciAoWiHynFSeS5qnXSLWrY0tf5V775IPgmgM6oo2r+yYyCtTfedUnf67eO703lOGsi/Ylb7v1r/6oAbRZ439a+xsO50lXXU/8G/TWtnDb8rralj4wnmeTR9zLd3iPd82oLB+u+36MfSeb55YFdaW9+5Iq2NRZ4xpLbpdIEoPzXHuNjWh0TuWL84t+Zz6XP5ggL38XSKY7tD1A6KjKdFIi9OnxNy2TZQ57T5jmQHgE0AXgLgIQC3kvxkRHyr6s++CWA4IsZJ/jqAPwXwmkrtYOUu+qYo1EGKiF0A1lT9fs1R/v5DAD5UZFl2dFnnyMzMTGmzfz0uBHBPRNwHACQ/jplvo77fQYqI/6z6+5sB/OJsNcbPYjMzM7N2cDqAB6t+f6gyLfNGzEQOHdFTuRP+ZpI/32hj2vZRI2ZmZvajg+RGABurJm2OiM0F3+sXAQwDeEHV5DMjYjfJswF8nuQdEVE4M8gdJDMzs3mqlY8AqXSGVIdoN4CVVb+fUZn2Q0i+GMCVAF4Q8YMH8EXE7sp/7yP5BQAXACjcQfJXbGZmZtYObgWwiuRZJLsAXAbgh+5GI3kBgA8DeEVEPFo1fQk580TxSozQT6Lq2qUiPIJkZmY2T7XTRdoRcZjkmwF8FkAHgOsiYjvJ9wIYiYhPArgawACA/6+SHvSdiHgFgPMBfJhkGTODP++vufvtuLmDZGZmZm2hEib9mZpp7656/eJkvq8CeGYz2+IOkpmZ2TzVTiNI7aapHSSSV2Ems6AM4FEAr4uI75L8fcw8vPbIMs8HsCIi9mbvpQLjVHDXSvaltRVJIOSu6dF0npM68vdToXwq+K2j4EVxp2efjXkY3oSIcFOBiSpoUX1uFTg4Id6zP9kVe5lv6ydiKq2p/adThAqqbaLSiLQAACAASURBVHMyutJaiENp7YJldaefN7AknefvHvl6WnvWkrPS2oVdJ6e1BeKzqZPk3ThYd/pbvpq3X4VBvmvkqrR24NfekNb+/tYz0truUr7fqWDBxcm5ZLCUb89TFp6f1v76e19Jay8+eW1aW8Y8rHaQ+X43kWw5dYwuFqGI0yIMcm8cyucTx5sKmCzyz7O6cPaUmUtQ6poSx28Wwgvoc5oKj822gWMi545mX6R9dUSsrSRZfgrAuwEgIq6OiHWV6e8E8F+qc2THRyUFm5mZZdrtUSPtpFAHieQQyR0kryW5neQWkr0R8WTVn/Wjfmf5tQA+VmS5ZmZmZq3QyAjSKgCbImI1gH0ANgAAyfeRfBAzX6m9u3oGkn0ALgbwzw0s18zMzJqgzNb9zDWNdJDuj4htlddbAQwBQERcGRErAVwP4M0187wcwFeyr9dIbqzEhI/sGL2vgaaZmZmZFddIB2my6vU0nnrB9/WojCpVuQzi67WI2BwRwxExfP7g2Q00zczMzI6mDLbsZ65p6kXaJFdV/XoJgJ1VtUWYeWbKJ5q5TDMzM7Nma3YO0vtJnouZezcfAHBFVe1SAFsiYqzJyzQzM7MCfA90rlAHKSJ2AVhT9fs1xzDP3wH4uyLLq6UyN4rkUvSX8lyQh6fH09qyUp5d0idGE1XmxmChTcI0v2cUh9O5JkJlJOWDiwuYf7hekVFVLnAoqm2tjImMpBUic0btP4XbkmyD0ci3zYtWrElrd4w9mNbYdUpaOyza36WOmyQ3akBsa7WuVNbRwIevS2vPWP3OtNbZlR/Dd3Tk+3m2T3aJ/V/tI+uXr0prdx7It9vagaelNXW8LUjaqY41lQulcsAOi/PWAbEvqxiShcy3W5bFpraNku+twJj4bGPis3WJnLYFyRKL5uBZ6zlJ+0eADzgzMyvCSdq5ZgdFmpmZmc157iCZmZmZ1fBXbGZmZvNUWVzjNt95BMnMzMyshkeQzMzM5inf5p/zCJKZmZlZjbYdQVI5Kvq2xOPvD5/G3rR2sKM7rd19+Im0dkbHwrTWk+TKAMAB5Jktap0sRf08EZXZ0iMyPFSuSZ/YbZ4U8/WL5alslswA83aUxPfqKhZhSqxjNd9kgRyVaTHPEub73fqBobR249g9ae3krkVp7eULTk1rvcn+2hf5+niC+Wf7+1vPSGsq6+iF2/9HWnv2r7w+re3cnmdDFdEt9oMf7zwprV3QuSKtferJHWntwsGz0lpPciz2imNNZSQtFcf2qDjeVB6QypKbLOX7yWJ21Z3eLTOe8m2j/t1Q55+i58lS0pSVyHPYTgTf5p9r9qNGriJ5O8ltJLeQPK0yfQnJGyq1W0jmKXh23LLOkZmZmRXT7K/Yro6ItRGxDsCnALy7Mv0PAGyLiLUAfhnAnzd5uWZmZnacymzdz1xTqINEcojkDpLXktxeGS3qjYgnq/6sHz/4vusZAD4PABGxE8AQyZMbarmZmZnZLGlkBGkVgE0RsRrAPgAbAIDk+0g+COBy/GAE6TYAr6zULwRwJoD8QgQzMzObdWWwZT9zTSMdpPsjYlvl9VYAQwAQEVdGxEoA1wN4c6X+fgCLSW4D8BYA3wSeejUyyY0kR0iO7By9r4GmmZmZmRXXSAdpsur1NJ56R9z1qIwqRcSTEfH6yrVJvwxgBYCn9IAiYnNEDEfE8HmDZzfQNDMzMzuaaOHPXNPsu9hWVf16CYCdlemLye/fs/mrAL5Yc72SmZmZWdtodg7S+0mei5lohQcAXFGZfj6Aj5IMANsBvLHJyzUzM7PjNBfvLmuVQh2kiNgFYE3V79cc5e+/BuDpx7MMFcqnAhPVtl6QVA+L91NDbH2l+kFmALCnfDCtndrRn9Z6xCfI2j+GafQmLe0Wn0AFxqkQxsNRbP0r2fZWbVTKoo2qkWp770ceCqekIXqiiUuYZ1v1IQ+uW9t3Wlr7yv48RPLpPflNpbd3119h3SIosk+Eoe4u5WGonV3551ZhkAs/+pG09vj6301ri8V6zvTIYyqXHb8AsLw7D/G8ac/2tPaKZc867mWp8+e4+ARqv5sQAbfLSnkwojrPZ+eu7FwHACXxfofEZ8tbD3SJ5Q2K/ScLrVRhwNZe2jZJ246dOmGYmZllnKSd87+sZmZmZjXcQTIzMzOr4a/YzMzM5qm5ePt9q3gEyczMzKyGR5DMzMzmKd/mn/MIkpmZmVmNth1BGorutPYY8zwa9X3qZHJDo8r3yLIsAOB0LklrB0t5S24r78vfs5RnJGW38x9GpHkiKrNFUflJZL5OVB5Kp3jPLKNERRiMimX1ZNlDAMYin69DfLbJyPc7tbxFyWFGkaESYk9WOTb94j0vWnx+Wnv1976Y1jacMlx3+kCpWPvVfnBHR75tdm4/Ja2prKOPbv1AWtuy+sq607/Ym84i9ztFnWcu7xxKa+f358/1vvSRr9SdvuHk+tsMABaJfURlBfWJ7abOM10iE2tMrMssA21CtFHlP6mayiZSZ1B1LE4k55l+ca44EXybf25WRpBI/i7JILm88vt5JL9GcpLk783GMuczFbZmZmZmx6/pI0gkVwK4CMB3qibvBfBWAD/f7OWZmZlZMR5ByhUaQSI5RHIHyWtJbie5heSRQek/A/B2VH3bFRGPRsStAKYab7KZmZnZ7GpkBGkVgNdGxJtI/hOADSRHAeyOiNvUdSpmZmZ24olHKs57jVyDdH9EbKu83grgbAB/AODdRd+Q5EaSIyRHbjlwdwNNMzMzMyuukQ7SZNXraQDPAnAWgNtI7gJwBoBvkMxvPakREZsjYjgihi8cWNVA08zMzOxoyi38mWuaeZH2HRGx4cgvlU7ScEQ83sRlmJmZmc26luQgVUaRRgAsBFAm+dsAnhERT2bzqKyjAZEnMi76qaXkdniV/XEorQBj4rtbdev9KaW+tLYnJtPaMubZUFlukcpxUj161X6VQ6KMIt+my1A/m6VorkmXGBztFbks6pNNUWXE5Ptktr6mRPZKvzg0VY4QRS6Lyia6NMk6AoAv7P923enPGMjzeZ62YDCtLRbrKsu+OZrFItsnyzoCgIu2v6/u9NOe/TvpPDeUBtLaXTGW1oJdaU3skhjvydfXhp762+2Lo/klChcMDKW1M0UO25TYNlnGHKCz6VR+UpYxpM4/i5PzCDCTF5cpmoWn8pN6ko06hmn0iOW12lwc2WmVQh2kiNgFYE3V79fU+ZuhqtcPY+YrN5sFKtTRzMzaRzt1jkxr2yRtMzMzm13FxmznBw89mJmZmdVwB8nMzMyshr9iMzMzm6fKDopMeQTJzMzMrIZHkMzMzOYp3+af8wiSmZmZWY22HUE6KPq1KiBwUeR9vp7kAbp7RYBh0VsgZYCY6JeqMMiHywfT2qIkhG6ZCKdTAZmK+sp6UO5S+Xr+XkwcdztWiHWlwt2mxHvmMXPAuNgbVIje/qi/xIORr4/BUrFDU4VBTkS+vdW6HF54dt3pt+y/J52nb9GPpTX12VTAZ1Ff7M1rWSDkmm/8WTrPWb/5xrT2W19fmtbUPrlQnLf6xNNE+0r1M3XWizDIrz95b1o7PJjPt7pjcVobE+e7sWT/B4AOsb2z8E+VI7RPHN2HIm9j0XNJkbDaLADzRPEIUm5WRpBI/i7JILm88vslJG8nua3yMNqfmo3lzldZ58jM/v/27jxOrrJOF/jz9JbuTjodOgtBgukkBJUECNAEnevo4DhehxmNGNzniowaR4VxRkdHXPk4rlwYnKvoTKIsgzjqxwWXEcWFEQEFO5iVgCxpIJEQSEjSWbrT6f7dP85pLYrz+3X3qerqKvr58qkPVeett973bNVvzvKUiEg+ZT+CRPI4AC8B8FDB5J8B+J6ZGcmTAXwDwLPL3baIiIiMXnUdz6ouuY4gkewkuYXkGpKbSd5IcvhA9uUA3oeC5W5m+81s+PVUaJ2IiIhIFSvlFNtiAFeY2RIAewCsJLkCwHYzW1/8ZpLnkLwbwH8D+NusDyS5Kj0F131X7wMldE1ERERGMsTKPWpNKQOkrWa2Ln2+FsBCAB8A8JGsN5vZd8zs2QBeAeBfnPesNrMuM+s6sS37wlARERGR8VbKNUj9Bc8HAZwCYAGA9UzuFpsH4E6Sy81sx/AbzexmkgtJzjKzx0toX0REREqgu9h85byLbaOZzTGzTjPrBLANwGlmtoPk8UxHTSRPAzAFwK4yti0iIiJSNpXKQVoJ4I0kBwAcAvCagou2M0WnK/uDa7yb6JfNHMoeD+4OhokDwfi6PuhllJ0RaQnGrM+o8wNdHrP+zOkzgmSf/mDeopEzw4yhfFlBfU5GSX+QrxJll0T9j9bNwaC91iB/JfrMKczuTW+8C7ji7c7vY72TAwYAQ8G6mVfXmjl997RnuHV+u7/HLZs7/TluWbRtTQnKomyx3mCdfqduWub0KOto6hVfdsvmdX3ILYvspN/Hac72A/jbwsy6ZrfOqUHW0X19O92yRVOnu2VRxlBTsE3Whdty9nxH22ok+i4/Enxm9Pcm6ouXM5f3b8N40R1TvlwDJDPrAbC04PWlGe/pLHj+GQCfydOWjMwbHImIiEg+VZukLSIiIuMr7xG5yUC/xSYiIiJSRAMkERERkSI6xSYiIjJJ6TZ/n44giYiIiBTRESQREZFJSpdo+6p2gORlYADAYLBKd+CwW/ZYXXb+RKf5eTpRPsYTQXaJXwL0BaVTgvn2yuaxxe3nw0MH3M+bzia3rJlRdokvWjdtwebWXpddFn1elOMU5RlF21ZeUV+mO1lULXX+Mt6DAbfsYJA50xqst+Ygjyba7jzLG+e4Zac3znbL/v2RW/16sxa7ZWcE7eU9TXCPZe8f77q9w60TZR1d3P1xt+zAhX620lW3HuuW7azz5y7K5vKyoWbX+9loi4Oso9U7fuWWvXjOSW7Z7CCTqSXov/c9GW3H7dF3DP2yKColyuaK9jdvrR2BhXl3Uj3GZS2RfA9JIzkrff1nJPeSXJc+Mn+vTfKJBnEiMvlEwZkysaptcDRUwUetKfsRJJLHAXgJgIeKin5pZn9d7vZEREREyi3XUJZkJ8ktJNeQ3EzyRpLDv4NxOYD3Qac2RUREqtoQK/eoNaUc61sM4AozWwJgD4CVJFcA2G5m6zPe/zyS60neQHJJCe2KiIiIjKtSTrFtNbN16fO1ABYC+Cskp9eK3QlgvpntJ3k2gOuRDLCehOQqAKsA4EUdXVjatqiE7omIiEhEPzXiK+UIUuFl/4MATgGwAMB6kj0A5gG4k+RcM9tnZvsBwMx+CKBx+ALuQma22sy6zKxLgyMRERGZKOW8SHujma0cfpEOkrrM7HGScwE8amZGcjmSgdmuMrYtIiIiY6TjR75K5SCdC+DtJI8AOATgtWam9SIiIiJVKdcAycx6ACwteH1pxns6C55/HsDnx9LGQJCaEAX91QehXl7ZPvptzRry29pLv60o4DBPKF+kAUSDM29RGOTOoUNu2cwg3K2R+fo/FKybOqcsaulwsI0MBONvBustEm1b3vIH/G0hqtNvQQimHXHLooDPaJ+aGoTv9SK7vYFgGz8Q9PHFR5/slm3a/7BbdmoQPhktyyhM0Zz9ozH4vEgUBjn1c192y5Yuucgtu7fJD3bcVJ+9nKNtNZq3DvP/JCzrWOiWbT6wza839ZluWX2dH9Lria6Z8b5HgDjwMSo7nDN0dsjZh6fk/P4cL7WYT1Qp1bWmJJfoj4OIiIiMXdX+1IiIiIiML93F5tMRJBEREZEiGiCJiIiIFNEpNhERkUlKJ9h8OoIkIiIiUkRHkERERCYp3ebvq9oBUnvQtSh/pS/4TK9WlFm0t84v6xz081V21Pub3Q4cdsuag8yW5uCAn1fSEeQgTav3l/Fu8/s4I+hjJFpvXk+i5RFllzQHWUf7bCCoF2TmBP2P8lDyZOq00V83UQ7VriF/D4gysaJsKG++e4PlGOXRzKSfsXXyND8z5wf7trhls6a0u2VvaOx0y7xFOd38ZbyTfi7OVbce65ZFWUd/tvlTbtmy153vlq2/d07m9GhfC/PDgm3rzKa5/mc2ZfcDAL6/7y63bHmbn63kfXdFp4QOBplF0XdJlBvVEvwteizIkqt3vhPmB9u/VJdxOcVG8j0kbfj31ki+l+S69LGJ5CDJjvFoezLSeVIREcljCFaxR60p+99WkscBeAmAh4anmdn/NbNlZrYMwEUAfmFmu8vdtoiIiEg55BogkewkuYXkGpKbSd5IsiUtvhzA++AfCX0dgP/K066IiIiUj1XwUWtKOYK0GMAVZrYEwB4AK0muALDdzNZnVSDZCuClAL5VQrsiIiIi46qUi7S3mtm69PlaAAsB/BWS02uelwG41Tu9RnIVgFUA8NKOM7Cs7fgSuiciIiIR3cXmK+UIUn/B80EApwBYAGA9yR4A8wDcSbLw1ofXIji9ZmarzazLzLo0OBIREZlcSL6U5D0k7yP5/ozyKSS/npbfTrKzoOyidPo9JP93qX0p50XaG81sjpl1mlkngG0ATjOzHQBAsh3ACwF8t4xtioiISE5Wwf9GQrIewBUA/hLAiQBeR/LEore9GcATZnY8kmueP5PWPRHJQZglSC7l+UL6eblV8g7xcwDcaGYHKtimiIiI1IblAO4zswfM7DCArwFYUfSeFQCuSZ9/E8CfMwlyWwHga2bWb2ZbAdyXfl5uua5BMrMeAEsLXl+a8Z7OotdXA7h6tG3swRG3rCUY10VhYFOcMLAjYfCkf4Z2e70fLhYNW/Oe84364olCCqP5bgqW8fahg27ZsXWtblme0XhUJyqLghujEMYoYC8SLWdvrUUBpVNy/tslCoOM/gUXhQfm6clg8HltQR8bgsDK5W0L3LKf7Nrslj1n6jy37GBz9p7aan4/pgVhijvr/Pm+t6nRLYvCIGf811Vu2WOn/0Pm9LlBGGEU4ul9RwJxCONAsL47mtrcsp8+vskte/Xs0zKnR99b0Tdk1McoIDbaN9rhb8sHLftv2MEqu+qnkr0pvM44tdrMVhe8PhbAwwWvtwE4s+hj/vAeMztCci+Amen0XxfV9ZNbR6Fqk7RFRETk6SMdDK0e8Y1VQgMkERGRSarKEq63Aziu4PW8dFrWe7aRbADQDmDXKOuOiX6lQkRERKrBbwAsJrmAZBOSi66/V/Se7wE4L31+LoCfm5ml01+b3uW2AElW4x2ldEZHkERERGTCpdcUXQDgx0gu5b3SzDaT/BiAbjP7HoAvA7iW5H0AdiMZRCF93zcA3AXgCIB3mpl/4dwoaIAkIiIySVXVCTYAZvZDAD8smvaRgud9AF7l1P0EgE+Uqy86xSYiIiJSREeQREREJqkqu0i7qlTtAGlqkCQU5QFFWRcDTsZHlAsSZW40BPUiJ5ifUfIo/fynvUE2lJebE238rcEybgzyaGYFOTb3DvW6ZXPqWtyydqcvUS7R9GDzjdZbc1AvynqJtpM8+Un1wecdCrbjaLuLMp6i9qJ9ytu2ZtDP9YlEbTWEGWf+vL185ilu2TmP3uqWrWzuypzeWufvG9FyjPapTfX+/rv+3jlumZd1BABfX/vZzOk3LfmAW+fmFn8Z7wq+Y6Jvuw7428J5TYvcsiXT5rtlL/v9LzOnnz33VLdO9B2TJyMPGCFbiUG2GLNrHtaApGaMyyk2ku8haSRnpa+PIvkdkhtI3kFy6UifIaOXN1RQREQmt6EKPmpN2f+ykjwOwEsAPFQw+QMA1pnZyQDeCODfyt2uiIiISLnkGiCR7CS5heQakptJ3khy+Njm5QDehydfHH8igJ8DgJndDaCT5NGldFxERERKU00/VlttSjmCtBjAFWa2BMAeACtJrgCw3czWF713PYBXAgDJ5QDmI0m5FBEREak6pQyQtprZuvT5WgALkZxK+0jGez8NYAbJdQAuBPBb4KlXw5JcRbKbZPeG3vtK6JqIiIiMRNcg+UoZIPUXPB8EcAqABQDWk+xBcoToTpJzzWyfmZ1vZsuQXIM0G8ADxR9oZqvNrMvMuk5uO76EromIiIjkV87b/Dea2crhF+kgqcvMHic5A8BBMzsM4C0AbjazfWVsW0RERMaoFq8NqpRK5SA9B8A1JA3AZgBvHqlClN/TFuRZHAzyLLwNIcqwyXtYMKq318nHAICFg/4qubfe72eU++OJDh9GmT/RvM3gFLdsx9BBv7261szpUXZJ1P9onUZl0XxH9tqAW9bu5AVFeTrjEd0QzVvUXp4guWgbaQy3Lb+tFvrbQpQNtfLo7KwjALi5997M6adP63TrzKzzc8yag+UYre9om5xLvz0v7+iszZ9063Qse7db9p2G7P0QAB60PresLshN66W/TO5o9tfpK485I3P6z/dsceuc0e5nLh1bN9Uts2C99Qdb82Cw3hqdz1QoS+3INUAysx4ASwteX5rxns6C578CcEKetmRkeQZHIiIitXhtUKVoMCsiIiJSpGp/akRERETG15DpDIRHR5BEREREimiAJCIiIlJEp9hEREQmKZ1g8+kIkoiIiEgRHUESERGZpPLknE0WVTtAesoPtRXoDUpnBMGCnt044pblDQ6cGhyc2xu0N1Dv93+2+aurj9kbeTRvfUECRjTX0Q7VHITCHUs/qO0J68+c3hJsorPY5JYdDLcgX5QJcjT89qL5ftiyAzLzzlsUTlcfBhX6DgRz7u0D0fYTLf8ZyA7OBPxwPSDe7qJl4gV1AsCpTiDk7fvu9+u0ZdcBgNn10bz5e9XhHMsfAG5uyV5eURjkKev+1S1bcP75btkFG45yy6IQTH+JAFPMr9dWl71/nNnu/wzVxgMPu2XWeqxb9pz6drdsb7BuDtvYv2dmB2G6Ul3KeoqN5MUkt5Nclz7OTqfPJHkTyf0kP1/ONsUfHImIiESsgv/VmvE4gnR5RrJ2H4API0nfXvrUKiIiIiLVI9cAiWQngBsA3ALgTwBsB7DCe7+ZHQBwC0n/2KiIiIhUlH5qxFfKKbbFAK4wsyUA9gBYmU6/gOQGkleS9E9aZyC5imQ3ye5Nvf41ACIiIiLjqZQB0lYzW5c+XwugE8AXASwCsAzAIwAuG8sHmtlqM+sys66lbf6vMouIiEjphmAVe9SaUgZIhbcdDQJoMLNHzWzQzIYArAGwvKTeiYiIiEyAsl6kTfIYM3skfXkOgE3l/HwREREpn1q8u6xSyn0X2yUklyFJL+8B8LbhApI9AKYDaCL5CgAvMbO7vA/qy5ljMxikvUy37ANme+hncTQF+R77gowhBvWizTHKQxlwsnbqQbQPZbfXW+f3I8qqGci50zTnPCjZ7GyKDw/uc+tMaZjhlkW5OE05s4Kiz4xyo7xson122K0zO8hBikR9jNbp1GDOvVq9wfYf5cMM0v/aifJ0OoKvq4NRVk1QNr8uO5vrSJB1dF/fTrds8dTpbllHkGPm7dsAMCVYJrucdfCdhla3TpR1NP2qq9yyxV0fdsv2B98lj9LfTtrob3fed2hbkGu1ZOo8t2zD/ofcskXT/fXWF23Lwbbl1VMOUu3INUAysx4U3K6fcVt/Vp3OPG3JyLzBkYiISER3sfn0W2wiIiIiRar2p0ZERERkfJnpGiSPjiCJiIiIFNEASURERKSITrGJiIhMUrUY4FgpOoIkIiIiUqRqjyC1BV2Lck32Btkse5274Y8K2joUtNUaZMdEI8/GINckyqp5DAPZ0+v8HJ5jzc8MORRkkBzIefNnf856M5xsk7aGDrfOtqGDbllHXb6skcZgzfUGWS9RttLRTu7JkSDr6EDOHLC8+oL15i2TqcF+MzXIOtod5D8dCfrRG3xmtC+2BuvG29+W1PsZW4uCrKPVO37lli3rWOiWndk01y2L8sq8/f5B63PrXLDB/4nMKOvow93/4pbtf9vfumVX/8bPJnq8buzfr9OC761O+vlPndOnuWVrdtzmlr1o9lK3bG69394cNmdOP1Jl0Yy6zd9X1iNIJC8muZ3kuvRxdjp9ecG09STPKWe7k51SkEREakM1DY4kNh5HkC7PCI7cBKDLzI6QPAbAepLfNzP/cI+IiIiMq+o6nlVdch1BItlJcgvJNSQ3k7yRZIv3fjM7WDAYaoYG0SIiIlLFSjnFthjAFWa2BMAeACvT6ReQ3EDySpJ/ONlN8kySmwFsBPB3OnokIiIysYZgFXvUmlIGSFvNbF36fC2ATgBfBLAIwDIAjwC4bPjNZnZ7Opg6A8BF5FOvYCO5imQ3ye4NvfeV0DURERGR/EoZIPUXPB8E0GBmj5rZoJkNAVgDYHlxJTPbAmA/Cn7stqBstZl1mVnXyW3Hl9A1ERERGYmZVexRa8p9F9sxBS/PQXJxNkguIJN7dEnOB/BsAD3lbFtERESkXMp9F9slJJchuQi7B8Db0unPB/B+kgNIYhfeYWaPl7ltERERGQPlIPlyDZDMrAcFp8gybusvfv+1AK7N01aWKJSvPrgQzAuFizaQKGTucNDWkZwXpEVBi1HAZL1Ttp9+P9rNn7e+oF50sV001/F68/jz3OaESwLAY0OH3LIZTnAjALQHnxnlTfUFYX7eGo0O30aBoQMWbCOMlnE0B3572XF3sSjmcjBoa39w70ZTEBAYLf/mYEl7+1sU1HnY/LIXzznJLdt8YJv/mU1z3LKB4DuhA9nbax3H/l0BAPuD+Y7CIKf9x5Vu2dIlF7ll9zf5+9v6+uxtIfoejMrmBKG5pwQhntF6a2lb4Jc526ty62pH1SZpy+jFf/hERESyKQfJp99iExERESmiI0giIiKTVC3mE1WKjiCJiIiIFNERJBERkUmqFvOJKkVHkERERESKaIAkIiIiUuRpd4otzw3vUeZJlN0zd8jPZdlT52eXRPlJUSZTdDGdly3TF3ziUJB1NMv8eTsY1DsUtJdnNN4QrNEONrllbfQ37R1BRlKUgxRtJ61BkpM331Fmy2DQVpR1FIlv5/X7FhWlwgAAH2xJREFU4q3TqP9RDtjUYN1EfdwxeNAtm1nnpzU1BcvLa+2ADfifF6zr2UE/lk19plv2/X13uWUdTW1u2XlNizKn9wbz7G/hwKP0c6iu/s08tyzKOvqzzZ9yy059w/lu2V33zM2cHmWEhTlyQTbU85qOccvqg7IfH9rqlrW3ZC+vufBz2CaCLtL2lfunRi4muZ3kuvRxdjq9k+Shgun/Xs52J7soeE9ERETGbjyOIF3uJGvfb2bLxqE9ERERyUFBkb5cR5DSI0JbSK4huZnkjSRbyt05ERERkYlQyim2xQCuMLMlAPYAWJlOv4DkBpJXkjyq4P0LSP6W5C9I/mkJ7YqIiEgZDJlV7FFrShkgbTWzdenztQA6AXwRwCIAywA8AuCytPwRAM80s1MBvBvAV0lOL/5AkqtIdpPs3tB7XwldExEREcmvlAFSf8HzQQANZvaomQ2a2RCANQCWA4CZ9ZvZrvT5WgD3Azih+APNbLWZdZlZ18ltx5fQNRERERmJVfBRa8p9F1vh/ZDnANiUTp9Nsj59vhDJ6bkHytm2iIiISLmU+y62S0guQzJY7AHwtnT6CwB8jOQAkqifvzOz3dEHRSO3/mAsmmfEVx/kufiJJ8ChIA9omvk92RlkjUSi2/mbnZ5GOUiDwXwPBPPWGizlXvPnjUH+TaPzmYdz5ipFy6qJ/lrtGex1yxbU+3k0UXt1znKO8lzybpPecgTiPkZZKFHekZcT1hD+e9Ffp9ODHKr+IFssWl5RflWz0//6YDl66xMAWoK1U1/n598sb1volv308U1u2ZJp892yO5qz+zLF/P63BfvG48Hyv7/JX29R1lH7dVf57Z3+nszpUY5WX7DdRZlq0Z1c0bd1R8M0t+zGvXe7Zee0Lw0+tbKUg+TLNUAysx4ASwteZ93WX/j+bwH4Vp62ZGTe4EhkPEUhqjKxvMGRTLxqGhxJ7GmXpC0iIiKjoyNIPv0TUERERKSIjiCJiIhMUlaD+USVoiNIIiIiIkV0BElERGSS0jVIPh1BEhERESmiAZKIiIhIkao9xRaFQQ4EQXNRUJ4XeNcbRIH5LQG7/NyxMLiuLVjsTUF7Q27g4BD22EBm2YwgeC8KKvQC9ADgQLBUlqDVLdsTBPYddvqSL24QmAl/vmfTX8oD9X7/7x7a55YdW+fX85ZlFMAYrZtovqMwyGBzDR1yWjwyDofmpwTb3YxgvUX1olMI3vKK9pvoO6Yv2MYjHcG8vXr2aW7Zy37/y8zprzzmDLdOW53//cNgK2kN8tbW1/vfoXfdM9ct88IgAeCatZdlTr95yUVunduC/Kfd9NdNtE9NDdb3ufXHuGXHN83JnH5jlZ3SikIyJ7ty/9TIxSS3k1yXPs5Op7+hYNo6kkNp4raUgTc4EhERkXzG4wjS5cXJ2mZ2HYDrAIDkSQCuN7N149C2iIiIjJJu8/flOoJEspPkFpJrSG4meSPJllFWfx2Ar+VpV0RERKQSSjnFthjAFWa2BMAeACvT6ReQ3EDySpJHZdR7DYD/yvpAkqtIdpPs3tR7fwldExERkZEMwSr2qDWlDJC2FpwmWwugE8AXASwCsAzAIwCedJUdyTMBHDSzzJ+nNrPVZtZlZl1L2xaV0DURERGR/Eq5Bqm/4PkggBYze3R4Ask1AH5QVOe1cI4eiYiISGXpGiRfue9iK7zn8RwAmwrK6gC8Grr+SERERKpcue9iuyS9fd8A9AB4W0HZCwA8bGYPjOaDomyGuiCrI8ohaXZyPKJ8jyiPJso6ikaeB4I+zghWyTSnn7PYiMeRfat/lIsTieY7coh+vfmD/nK+18lRifJJIl6uUvKZflm03c2ua3bLtg8ddMu8jKQoDyua78O5l4ov2qe83LFoG4+ygqJ6TUHplGDdtITZRP7y8sq87wog3n7y1ov2tihv6uy5p2ZO//meLW6dM9uPd8vagvynafTnLW+m11T6+4CXd/SCzZ9y68w8/R/cshtsulu2EQfcssFgmbTQ3+42OplMh3HYrTMRavHaoErJNUAysx4ASwteX+q/+w/v+R8Az83TnsS8wZGIiIjkU7VJ2iIiIjK+lKTt02+xiYiIiBTRESQREZFJakh3sbl0BElERESkiI4giYiITFK6BsmnI0giIiIiRTRAEhERESlS1lNsJC8G8FYAj6WTPmBmPyTZBOA/AHQhycB7V5qL5IrC0aYE47qhILDsALLDCKNwOv/T/AA9IA6M80vyhUjOQqMb9rUn+LxIFIIZBRU+FmQyHaz357zNWSr9QVu7grb6g/7H20++EMAoRPL3Q4cyp0ehfLM5xS2L9o3ocHkUL9kBvy/etrDL+jOnJ3X8ZTw3mLdIFEYYBV02BGUznPnekzNbrD34So36eDDYT6P1NqeuJXP6Ge3+b1luPPCwW7Zk6jy3rJPZgadAvG6ifbgv2F5vc4IWozDIJWs/65Yt+Me3umXvvLndLYvmLfoub3RmrZ7RX5XK00XavvG4BunyjODItwKAmZ1Ecg6AG0ieYWbljwSehJSEKiIiUl65TrGR7CS5heQakptJ3kgy+58yiRMB/BwAzGwngD1IjiaJiIjIBLEK/ldrSrkGaTGAK8xsCZIBz8p0+gUkN5C8kuRR6bT1AF5OsoHkAgCnAziuhLZFRERkkiDZQfInJO9N/39UxnuWkfxVeuBmA8nXFJRdTXIryXXpY9lIbZYyQNpqZuvS52sBdAL4IoBFAJYBeATAZWn5lQC2AegG8FkAtwFPPelOchXJbpLdd/WO6jdtRUREJKchs4o9SvR+AD8zs8UAfpa+LnYQwBvTAzcvBfBZkjMKyt9rZsvSx7qM+k9SygCp8ArNQQANZvaomQ2m1xatAbAcAMzsiJn9Y9qpFQBmAPhd8Qea2Woz6zKzrhPbFpbQNREREXkaWQHgmvT5NQBeUfwGM/udmd2bPv89gJ0AZudtsKy3+ZM8puDlOQA2pdNbSU5Nn/8FgCNmdlc52xYREZGxqaFrkI42s0fS5zsAHB29meRyAE0A7i+Y/In01Nvl5Mi305b7LrZL0vN6BqAHwNvS6XMA/JjkEIDtAP5PmdsVERGRKkZyFYBVBZNWm9nqgvKfApibUfWDhS/MzEi6I670YM21AM4ruFv+IiQDqyYAqwH8M4CPRf3NNUAysx4ASwteF9/Wn/X+Z+VpqxKifJIoDyhKKIlGy9Fn9oV5KP5nTrXsg4G7mZ39NJLBnHk6Uf+j+fayRqY58wUAe4I8kb6gl1GOU9TH5uCAa0NQNoNNmdN3OvlIANBRn10HGCkPKN9B4Wh9e8skmudDTuYYAAzAn7coVyba7qJ1GuUgeZlSh83fjqP8s3b6X6kMty1/zvPkrR1bN9WtY63HumUb9j/klnVOn+aWzTE/R6sx2E+jdbOb2evgBpvu1omyjlovX+OWdXZ9yC0bCPaNvfTXzQCz949qS2euZA5SOhhaHZS/2Csj+SjJY8zskXQAtNN533QA/w3gg2b264LPHj761E/yKgD/NFJ/q21dSQ7e4EhERORp4nsAzkufnwfgu8VvSEOpvwPgP83sm0Vlx6T/J5LrlzaN1KD+soqIiExSNXQN0qcB/AXJewG8OH0Nkl0kv5S+59UAXgDgTRm3819HciOAjQBmAfj4SA2OR5K2iIiISNmY2S4Af54xvRvAW9LnXwHwFaf+i8bapgZIIiIik5R+8cunU2wiIiIiRXQESUREZJLSj537dARJREREpAitghkIY/HWzle5HYtyYKbkGPNFGTD9QQZJlJ8UpSc1Bn2M8lyikb73mR3BQcKDQVtR9ke0vKJ1E/GWc7R1zjc/Tyfq/xNOvspI7UWfGW11ec7w9wztd8tm1jW7ZW3B+o76GGX0eKK7UqJ5jrbjaPuP9ptItA+3OjlCUUtedhIAPGGH3bJoGYf5W/Qzko5y1neUAxZlDx0O5m3NjtvcslM6/J+Gel7TMW5Znm1od7CMo+/kTvr7zUe7/RuaDrzrLW7ZNb98hlu2vS77eyb63gWAz/d8Pd+XaE7zZ55csUHAg7s2VHTeSlX2I0gkLyR5d/prupek02aSvInkfpKfL3ebk13ePxwiIjK5mVnFHrWmrNcgkTwLyQ/KnWJm/STnpEV9AD6MJH17qVdfREREpBrkGiCR7ARwA4BbAPwJkt9XWwHg7QA+bWb9AGBmO9P/HwBwC8njS++yiIiIlIMu0vaVcm5mMYArzGwJgD0AVgI4AcCfkryd5C9InlGOToqIiIhUUikDpK1mti59vhZAJ5IjUh0AngvgvQC+kf7uyaiQXEWym2T33b0PlNA1ERERGYmuQfKVMkDqL3g+iGRwtA3Aty1xB5IbEWaN9gPNbLWZdZlZ17Pb/LsiRERERMZTuYMirwdwFoCbSJ4AoAnA42VuQ0RERMpgqAaP7FRKuQdIVwK4kuQmAIcBnGfpcTWSPQCmA2gi+QoALzGzu8rcvoiIiEjJcg2QzKwHBbfrm9mlBcV/49TpHEsb0bm/vGF+nij4MBKFIkZhclE4WlMw5wNOwNgQzJ2HKDAub6hjVC+6IyJeJtmiAL0o1K45qBeFyUWiZRlFg3prNFoeU9nolu0bCoLygh0n6n17jq+CPAGMANALP6jzgB1xy6LAxGi/ib5LvG052sb7g/UWhUEeDua7JVj+cXhstmjd7A3K+szv44tm+wktmw9sc8vqg6BIf20DU501NxjsG9F6i/42RGGQU//tS27Zc5Z8wC1rbcxepxsbquvHYaO/R5OdEgafBvIO8ERERCSbfqxWRERkkqrFu8sqRUeQRERERIroCJKIiMgkpSRtn44giYiIiBTRESQREZFJStcg+XQESURERKRI1R5BirI/GnJkBQFAY47xYNSPKFcjypaYiSa3LMraifriiTJb/DQRYI75mTM76KeX+CkqQHOw/L0lEkUY7Ke/PPqDPJTjhvx521Xntxet7zzbSZQVNJP+NlIX/LzhbvMzkqbS390PBmvOyxiaEqzPKGkqygpqCrKO9gcZSW1BNk64DTnz3ZAz66s16H/0/fPY0CG3rD34vhhgdl+ieT4cZB0NBtvx3PpWt6ylbYFb9uNDW92yjoZpbtm59dn5SS30l6O/9IG9wffFNb98hlsWZR2dtfmTfntvOD9z+n33+G1JdSn7ESSSF5K8m+Rmkpek05aTXJc+1pM8p9ztioiIyNgMmVXsUWvKegSJ5FkAVgA4xcz6Sc5JizYB6DKzIySPAbCe5PfNgn8SioiIiEyQXAMkkp0AbgBwC4A/AbAdycDo7QA+bWb9AGBmO9P/Hyyo3oz410JERESkAnSRtq+UU2yLAVxhZksA7AGwEsAJAP6U5O0kf0HyjOE3kzyT5GYAGwH8nY4eiYiISLUqZYC01czWpc/XAuhEckSqA8BzAbwXwDfI5IpSM7s9HUydAeAiks3FH0hyFclukt339PoX9omIiEjphmAVe9SaUgZI/QXPB5EMjrYB+LYl7kDyY9OzCiuZ2RYA+wE85aehzWy1mXWZWdezgrsiRERERMZTue9iux7AWQBA8gQkd28/TnIBmdxjTHI+gGcD6Clz2yIiIjIGZlaxR60pdw7SlQCuJLkJwGEA55mZkXw+gPeTHEByVOkdZvZ49EFe9goA1AcZJQPBZ3qH+KJ0oagsyhHqjzaGICQmGrFG+TFe7lKUCxKVRfM9x/zN5tEgIynKEfIykqLDstHnRTk8e53sGABoNb/mg/S3rmh7zSP6KukLMosOBZf27Rw66JadUN8+mm49SbT84/3GX8YNwVZZF6zU6DP7gtyfZidTJ1qfUeZV+F1ifml90N7BYJ0edrJ98mS+AfGymvPUqyL+oCXIf2pvmeeW3bj3brfs+KY5mdM3NgdZU8GOMxDkJ22v8+e7tdH/vvOyjgCg/bqrMqd/HMD7uvxsJakeuQZIZtaDglNkZnZpQfHfZLz/WgDX5mlLRhaFUoqISPWotsFRLeYTVYp+akRERESkSNX+1IiIiIiML52B8OkIkoiIiEgRHUESERGZpHQNkk9HkERERESK6AiSiIjIJFWL+USVoiNIIiIiIkVYraPHd3S+OlfH6sKIwLEbDK7wnx6E2h0IIuOiz4x63xCUeiGSUVtRWVswb71BUGEU2HckaM9bb9EIPgrli0R9jMIP84Z4Djg9jdqK+hivN/+g8O4gRnVasL6j9ZZH9GlRCGxHMG/7g20y4tWKlnHef1VG2+uMYPkfDGoedvo5Hv/yzRvM2h6st+i7xNsWoqDOaPvJ+10S1WsJA0Wzl9cl3Z8MPhFonLWwvH/ERtDc/MyKDQL6+h6q6LyVasT9iOT+Eco70+TsUSN5Nclzx1JHfNEfZxEREY9V8L9ao1NsIiIiIkVGPUAiOY3kz0jeSXIjyRUFxQ0kryO5heQ3SbamdU4n+QuSa0n+mOQxZZ8DERERyUU/VusbyxGkPgDnmNlpAM4CcBnJ4XM7zwLwBTN7DoB9AN5BshHA5wCca2anI/kh209EDZBcRbKbZPddvQ+MdV5EREREymIst/kTwCdJvgDJNW3HAjg6LXvYzG5Nn38FwN8D+BGSH7T9STqOqgfwSNSAma0GsBrIf5G2iIiIjE4tHtmplLEMkN4AYDaA081sgGQPgOa0rHgJG5IB1WYze17JvRQRERGpoLGcYmsHsDMdHJ0FYH5B2TNJDg+EXg/gFgD3AJg9PJ1kI8kl5ei0iIiIlM4q+Kg1YxkgXQegi+RGAG8EcHdB2T0A3klyC4CjAHzRzA4DOBfAZ0iuB7AOwJ+Up9tSqBZvnxQREalqlbyCvcSr31dVql4l29K8Ta55q4U+at5qs49P53mrhT5Wet70GP9HLeUgrapgvUq2Vel6tdDHvPXUx4mtVwt9zFuvFvqYt576OLH18rYl46yWBkgiIiIiFaEBkoiIiEiRWhogra5gvUq2Vel6tdDHvPXUx4mtVwt9zFuvFvqYt576OLH18rYl44zpRWIiIiIikqqlI0giIiIiFaEBkoiIiEgRDZBEREREiozlt9iqGsm5AD6K5Id0PwLgQgArAWwB8C4zC38ot1aRfLaZ3R2U1wGAmQ2RbELyA8I9ZrZ7DG1MA3ACgAfMbE/wvpPNbMPoe/+kul0AjgMwCOB30TyN4rOqYpmUsjzS+uVcJtPMbP8Y3t8xluUx2jokZ0Tb0CjamA1gHpJl8sBY5qnoc8Z9eYy2XinLpFzLI/0s7TdP/ayyLhOSr4zaM7Nv5+2rjIOJTqoc6wPADc70HyEZFL0fwAYA/4xkJ7kQwHeDz3tpwfN2AF9O638VwNFBvTsBfAjAojH2fxqAjwHYDGAvgMcA/BrAm3Iuj4eCslcAeBTAIwBWALgdwM8AbAPwsqDeFwqePx/AQwBuAvAwgLODeoMA7gXwLwBOHGX/XwigG8BPATwB4AcAbgXwPwCOq+Vlkmd5TNAy+V9I/iGxGcCZAH4C4P503p7n1PlQwfMTAfwOwFYAPQDODNo6ks7XmwHMGEP/T0zr3QfgcLretgK4GkD7RC+PSi+Tci8P7TeVWSYArgoeV+bpox7j95jwDmR2CjjNeZwO4BGnzm8Lnj9UVLYuaOvOgudfAvBxJD/E+48Arg/qbQVwabrD35G+/xmjmLfvAngTkn/1vRvAhwEsBnANgE86df6f8/gcgH1BW78FMBfAAgD7ADwrnT4fQPcol8lNAE5Lny8cod5vkfwL6hNIvrjXIxmwdo5QZ3b6fAGA76TP/wLAjUG9ql8meZZHicvk3c7jPQB2B/XuAHASgOcBeBzA8wv2w1tHsTz+G8Bfps+XA7gtaGsjgL9G8tuOu9L94bUAWkZYJr8uWFfLAVyTPn8rgG9O9PKo9DLJszy031THMtGjdh7Veg3Sb5AMPi4relwKYIZTp3Be/rOorH6U7XaZ2YfM7EEzuxxAZ/DeJ8zsn8zsmUi+cBcDuJPkTSSj6PhOM7vazLaZ2b8CeLmZ3QvgfADe4dfzAWwCsLbo0Y3kX48uM9thZluRDBrvSac9iNFffzbdzO5M6z0wQj0zs01m9kEzOx7Jl/UcALeQvM2pU29mj6XPH0Ly5QIz+wmAY4O2amGZ5FkeQP5l8kkkPxbdVvSYFvQRABrNbKOZ/QrAY2Z2S9renQBagnrDnmFmN6R17hihzoCZ/cDM3oDkHwnXAXg1gG0kvxrUaylYV8MDGJjZGgBLnDoTtTyA8V8meZYHoP0mS8WXCcmjSX6Z5A3p6xNJvjmqI5VXrdcgbQHwtnTg8CQkH3bqfHf4ugIz+1DB+48HcE/Q1hyS7wZAANNJ0iz5ZwBGueOb2S8B/JLkhUj+tfIa+OFfB0g+38xuIbkCwO70M4ZI0qnzGwCbzOwpXw4kL476RrLOzIYA/G3BtHoATUG1Z5PcgGSZdJI8ysyeSM+3R/We1P/0i/sOku8B8AKnTjfJLwP4OYCXIzkcDpKtiAe2tbBM8iwPIP8yuRPJUc+1T+kI+ZagXuF2flFRmTdvC0l+D8k8ziPZamYH07LGoK0/LBMzOwTgGwC+QbIdySkLz/0kP4xkmbwSwDoAINkIfz+t5PIAKrtM8iwPQPtNlkovEyA5FXoVgA+mr38H4OtILvGQajERh61GegA4F+nhyoyyV4xQdwqA1wP4AJKLtT8C4CPB+z9a9Bg+RDsXwH8G9b6Wc95ORnIIfw+AWwCckE6fDeDvnTodAFpztHUGgOaM6Z0A/iaoN7/o0ZhOnwXglUG91+foYyOAdwD4PJJ/Kdan01sAzA/qVf0yybM8SlwmzxrefjPKouvpXp61LAEsAvA+p84Lix7ThtsB8M6grX/KuUxmALgEyXUlnwDQlk5vB/DcYHnMqsTyqPQyybM80vKJ3m+a0unVtN9UdJmk7/lN+v/CS0PcS0H0mJhHVSdpk5yC5E60ThQc7TKzjwV1foTk4ue1SC72S6vYv47QVnPa1vzRtpW3j6W0JyL5kZxjZjufjvXytiVPRXKmme0ar3ok/wfJ9/9PzOw0ks8F8Bkze+HYeyvjpVqvQRr2XSR3BxwBcKDgEZlnZq8xs0vM7LL0EQ6OUtcDeFlRW6O5ZTZPH732RlPvSYbPYT8d60V1SE4n+SmS15J8fVHZF6qh3gT0cS7JL5K8guRMkheT3EjyGySPKWe9SrZVUO8LY+xjR9FjJpJTNUeR7AjaKle9jvFqr4Q+vrTgeTuT62A2kPwqyaNHWW/GeNYrUx/HUu/TJGelz7tIPgDgdpIPknQHLHnrpd4N4HsAFpG8Fcl1sxeOUEcqrNqPIG0ys6VjrLMawOfMbON4t1WpeiRP84oA/MDMvD8QVV+vhLa+heRW4F8jOf8/gOTQfD/JO80s83MrWW8C+vgjJHdPTUVymvk6JHEVrwDwYjNbUa56lWyrhD4OAXiwaPI8JLdhm5ktdNqq+noltPWH7YfklwDsALAGyXVMLzSzzGueKllvAvq40cxOSp/fhOQ06m9IngDgq2bWVc56BfUbkJwGJoB7zGwger9MgIk+xxc9kFzofNIY69yF5M6De5DkGW0EsGE82qpUPSSnCn+O5DbZ4sehWq5XQlvril5/EEnmyUwU3Fo8kfUmoI95oy7GXK+SbZXQx/cgyUc7qWDaVq+NWqpXQluFt90Xb2ejjUMZ13oT0MctABrS578uKttY7nppeTOSo0jfBvAtAP+AjOuZ9JjYR7XexTbs+QDeRHIrgH4kI20zs5ODOn9ZwbYqVS/PXX21Ui9vW1P4xztIYGafILkdwM1IbuOuhnqV7mPeqIs89SrZVq56ZnYZya8DuDzdlj4KYMRD5rVQL29byH/XbiXrVbqPXwDwQ5KfBvAjkv+GZODyIqR3B5a5HpBsw71IspaA5KjotQBeNUI9qaBqHyCNebBjSQZFRdqqYL2L4e/g0XnrWqiXt63vI/ki+unwBDO7muQO/PFLZ6LrVbqPeaMu8tSrZFu565nZNgCvIvlyJInYrUEbNVUvZ1trkGRBAUk47SwAjzH5qaboj3ol61W0j2b2OZIbAbwdyc+gNCDJtbseSZp3WeullprZiQWvbyJ51wh1pMKq+hokeTLmv2Ou6uvVQh/z1quFPuatV2N9XATgFCSn3sfSVtXWK6GtvHftVqzeBPaxM61n41WP5FcAfN7Mfp2+PhNJFMQbo7aksqr9CJI82XfxxwiD/qdZvXK2NZpRfyXr1UIf89arlT7uQRIc+atRtFFL9fK2dX1BvbEs/0rWm8g+9o3i/WOulx5xMiSZTbeRfCh9PR9A7h/VlfGhI0g1hFV8p12p9Wqhj3nr1UIf89ZTHye2Xi30MW+9WujjWOuRnB+Vl3CJiIyDas9Bkie7jeRJT9N6tdDHvPVqoY9566mPE1uvFvqYt14t9HFM9Sz5nc8/PAAcQnIEafghVURHkGpIehHf8QDGdMdcLdSrhT5q3tTHaqtXC33UvGXWeTmSH2B/BoCdSE6xbTGz6IeGpcI0QKoh3uHZkQ7L1kK9Wuhj3nq10Me89dTHia1XC33MW68W+pi3Hsn1SO9UNbNTSZ6F5Pfb3hy1JZWlAZKIiEgFkew2s650oHSqmQ2RXG9mp0x03+SPdBebiIhIZe0hOQ1J+Ot1JHcix29xyvjSESQREZEKIjkVSSQAAbwBQDuA68xs14R2TJ5EAyQRERGRIjrFJiIiUgEke5F9O//wnW/TK9wlCegIkoiIiEgRBUWKiIiIFNEASURERKSIBkgiIiIiRTRAEhERESmiAZKIiIhIkf8PDj8CC7KvHawAAAAASUVORK5CYII=\n",
      "text/plain": [
       "<Figure size 720x720 with 2 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.figure(figsize=(10, 10))\n",
    "sns.heatmap(train_df.corr())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 123,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-11-18T09:12:35.236656Z",
     "start_time": "2019-11-18T09:12:35.138694Z"
    },
    "scrolled": true
   },
   "outputs": [],
   "source": [
    "def stdd(arr):\n",
    "    return arr.max(1).values, arr.min(1).values, arr.std(1).values\n",
    "\n",
    "train_feat = [stdd(train_df.iloc[:, :8]), stdd(train_df.iloc[:, 8:16]),\n",
    "             stdd(train_df.iloc[:, 16:24]), stdd(train_df.iloc[:, 24:32]),\n",
    "             stdd(train_df.iloc[:, 32:40]), stdd(train_df.iloc[:, 40:48]),\n",
    "             stdd(train_df.iloc[:, 48:56]), stdd(train_df.iloc[:, 56:64])]\n",
    "\n",
    "test_feat = [stdd(test_df.iloc[:, :8]), stdd(test_df.iloc[:, 8:16]),\n",
    "             stdd(test_df.iloc[:, 16:24]), stdd(test_df.iloc[:, 24:32]),\n",
    "             stdd(test_df.iloc[:, 32:40]), stdd(test_df.iloc[:, 40:48]),\n",
    "             stdd(test_df.iloc[:, 48:56]), stdd(test_df.iloc[:, 56:64])]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 124,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-11-18T09:12:47.906519Z",
     "start_time": "2019-11-18T09:12:47.895951Z"
    }
   },
   "outputs": [],
   "source": [
    "train_feat = np.concatenate(train_feat).T\n",
    "test_feat = np.concatenate(test_feat).T"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 134,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-11-18T09:20:34.612627Z",
     "start_time": "2019-11-18T09:18:16.083611Z"
    },
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/usr/local/lib/python3.5/site-packages/lightgbm/engine.py:426: UserWarning: Found `n_estimators` in params. Will use it instead of argument\n",
      "  warnings.warn(\"Found `{}` in params. Will use it instead of argument\".format(alias))\n"
     ]
    }
   ],
   "source": [
    "params = {\n",
    "    'learning_rate': 0.01,\n",
    "    'min_child_samples': 5,\n",
    "    'max_depth': 6,\n",
    "    'lambda_l1': 2,\n",
    "    'boosting': 'gbdt',\n",
    "    'objective': 'multiclass',\n",
    "    'n_estimators': 5000,\n",
    "    'metric': 'multi_error',\n",
    "    'num_class': 4,\n",
    "    'feature_fraction': .75,\n",
    "    'bagging_fraction': .75,\n",
    "    'seed': 99,\n",
    "    'num_threads': 40,\n",
    "    'verbose': -1\n",
    "}\n",
    "\n",
    "cv_results1 = lgb.cv(\n",
    "        params,\n",
    "        lgb.Dataset(np.concatenate([train_df.drop(['label'], axis=1).values, train_feat], axis=1), \n",
    "                                    label=train_df['label'].values),\n",
    "        num_boost_round=200,\n",
    "        nfold=7, verbose_eval=False,\n",
    "        early_stopping_rounds=200,\n",
    ")\n",
    "# print('CV AUC: ', len(cv_results1['auc-mean']), cv_results1['auc-mean'][-1])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 135,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-11-18T09:22:13.248428Z",
     "start_time": "2019-11-18T09:22:13.212192Z"
    },
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>multi_error-mean</th>\n",
       "      <th>multi_error-stdv</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>0.356946</td>\n",
       "      <td>0.015378</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>0.233881</td>\n",
       "      <td>0.016312</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>0.195106</td>\n",
       "      <td>0.013979</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>0.180306</td>\n",
       "      <td>0.013004</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>0.171991</td>\n",
       "      <td>0.009962</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>0.165878</td>\n",
       "      <td>0.011189</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>0.157193</td>\n",
       "      <td>0.012209</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>0.152910</td>\n",
       "      <td>0.009738</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8</th>\n",
       "      <td>0.150464</td>\n",
       "      <td>0.010811</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9</th>\n",
       "      <td>0.146427</td>\n",
       "      <td>0.011154</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>10</th>\n",
       "      <td>0.143978</td>\n",
       "      <td>0.011794</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>11</th>\n",
       "      <td>0.142878</td>\n",
       "      <td>0.010959</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>12</th>\n",
       "      <td>0.140434</td>\n",
       "      <td>0.013221</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>13</th>\n",
       "      <td>0.140190</td>\n",
       "      <td>0.013431</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>14</th>\n",
       "      <td>0.140066</td>\n",
       "      <td>0.012595</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>15</th>\n",
       "      <td>0.136274</td>\n",
       "      <td>0.009877</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>16</th>\n",
       "      <td>0.135051</td>\n",
       "      <td>0.009375</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>17</th>\n",
       "      <td>0.134928</td>\n",
       "      <td>0.010450</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>18</th>\n",
       "      <td>0.132726</td>\n",
       "      <td>0.009403</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>19</th>\n",
       "      <td>0.132604</td>\n",
       "      <td>0.009681</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>20</th>\n",
       "      <td>0.128934</td>\n",
       "      <td>0.008679</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>21</th>\n",
       "      <td>0.129424</td>\n",
       "      <td>0.009877</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>22</th>\n",
       "      <td>0.129546</td>\n",
       "      <td>0.010357</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>23</th>\n",
       "      <td>0.130035</td>\n",
       "      <td>0.009388</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>24</th>\n",
       "      <td>0.129668</td>\n",
       "      <td>0.009918</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>25</th>\n",
       "      <td>0.128811</td>\n",
       "      <td>0.008310</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>26</th>\n",
       "      <td>0.129301</td>\n",
       "      <td>0.010101</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>27</th>\n",
       "      <td>0.127833</td>\n",
       "      <td>0.009403</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>28</th>\n",
       "      <td>0.127956</td>\n",
       "      <td>0.010714</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>29</th>\n",
       "      <td>0.126610</td>\n",
       "      <td>0.011061</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2057</th>\n",
       "      <td>0.043547</td>\n",
       "      <td>0.004095</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2058</th>\n",
       "      <td>0.043547</td>\n",
       "      <td>0.004095</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2059</th>\n",
       "      <td>0.043547</td>\n",
       "      <td>0.004095</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2060</th>\n",
       "      <td>0.043547</td>\n",
       "      <td>0.004095</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2061</th>\n",
       "      <td>0.043547</td>\n",
       "      <td>0.004095</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2062</th>\n",
       "      <td>0.043424</td>\n",
       "      <td>0.003893</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2063</th>\n",
       "      <td>0.043424</td>\n",
       "      <td>0.004228</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2064</th>\n",
       "      <td>0.043424</td>\n",
       "      <td>0.004228</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2065</th>\n",
       "      <td>0.043424</td>\n",
       "      <td>0.004228</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2066</th>\n",
       "      <td>0.043424</td>\n",
       "      <td>0.003998</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2067</th>\n",
       "      <td>0.043547</td>\n",
       "      <td>0.004195</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2068</th>\n",
       "      <td>0.043547</td>\n",
       "      <td>0.004195</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2069</th>\n",
       "      <td>0.043547</td>\n",
       "      <td>0.004195</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2070</th>\n",
       "      <td>0.043547</td>\n",
       "      <td>0.004195</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2071</th>\n",
       "      <td>0.043547</td>\n",
       "      <td>0.004195</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2072</th>\n",
       "      <td>0.043547</td>\n",
       "      <td>0.004195</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2073</th>\n",
       "      <td>0.043669</td>\n",
       "      <td>0.004355</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2074</th>\n",
       "      <td>0.043546</td>\n",
       "      <td>0.004169</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2075</th>\n",
       "      <td>0.043669</td>\n",
       "      <td>0.004355</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2076</th>\n",
       "      <td>0.043669</td>\n",
       "      <td>0.004030</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2077</th>\n",
       "      <td>0.043669</td>\n",
       "      <td>0.004030</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2078</th>\n",
       "      <td>0.043669</td>\n",
       "      <td>0.004030</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2079</th>\n",
       "      <td>0.043669</td>\n",
       "      <td>0.004030</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2080</th>\n",
       "      <td>0.043547</td>\n",
       "      <td>0.004068</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2081</th>\n",
       "      <td>0.043547</td>\n",
       "      <td>0.004068</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2082</th>\n",
       "      <td>0.043547</td>\n",
       "      <td>0.004068</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2083</th>\n",
       "      <td>0.043547</td>\n",
       "      <td>0.004068</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2084</th>\n",
       "      <td>0.043547</td>\n",
       "      <td>0.004068</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2085</th>\n",
       "      <td>0.043547</td>\n",
       "      <td>0.004068</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2086</th>\n",
       "      <td>0.043424</td>\n",
       "      <td>0.003891</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>2087 rows × 2 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "      multi_error-mean  multi_error-stdv\n",
       "0             0.356946          0.015378\n",
       "1             0.233881          0.016312\n",
       "2             0.195106          0.013979\n",
       "3             0.180306          0.013004\n",
       "4             0.171991          0.009962\n",
       "5             0.165878          0.011189\n",
       "6             0.157193          0.012209\n",
       "7             0.152910          0.009738\n",
       "8             0.150464          0.010811\n",
       "9             0.146427          0.011154\n",
       "10            0.143978          0.011794\n",
       "11            0.142878          0.010959\n",
       "12            0.140434          0.013221\n",
       "13            0.140190          0.013431\n",
       "14            0.140066          0.012595\n",
       "15            0.136274          0.009877\n",
       "16            0.135051          0.009375\n",
       "17            0.134928          0.010450\n",
       "18            0.132726          0.009403\n",
       "19            0.132604          0.009681\n",
       "20            0.128934          0.008679\n",
       "21            0.129424          0.009877\n",
       "22            0.129546          0.010357\n",
       "23            0.130035          0.009388\n",
       "24            0.129668          0.009918\n",
       "25            0.128811          0.008310\n",
       "26            0.129301          0.010101\n",
       "27            0.127833          0.009403\n",
       "28            0.127956          0.010714\n",
       "29            0.126610          0.011061\n",
       "...                ...               ...\n",
       "2057          0.043547          0.004095\n",
       "2058          0.043547          0.004095\n",
       "2059          0.043547          0.004095\n",
       "2060          0.043547          0.004095\n",
       "2061          0.043547          0.004095\n",
       "2062          0.043424          0.003893\n",
       "2063          0.043424          0.004228\n",
       "2064          0.043424          0.004228\n",
       "2065          0.043424          0.004228\n",
       "2066          0.043424          0.003998\n",
       "2067          0.043547          0.004195\n",
       "2068          0.043547          0.004195\n",
       "2069          0.043547          0.004195\n",
       "2070          0.043547          0.004195\n",
       "2071          0.043547          0.004195\n",
       "2072          0.043547          0.004195\n",
       "2073          0.043669          0.004355\n",
       "2074          0.043546          0.004169\n",
       "2075          0.043669          0.004355\n",
       "2076          0.043669          0.004030\n",
       "2077          0.043669          0.004030\n",
       "2078          0.043669          0.004030\n",
       "2079          0.043669          0.004030\n",
       "2080          0.043547          0.004068\n",
       "2081          0.043547          0.004068\n",
       "2082          0.043547          0.004068\n",
       "2083          0.043547          0.004068\n",
       "2084          0.043547          0.004068\n",
       "2085          0.043547          0.004068\n",
       "2086          0.043424          0.003891\n",
       "\n",
       "[2087 rows x 2 columns]"
      ]
     },
     "execution_count": 135,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "pd.DataFrame(cv_results1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 140,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-11-18T09:25:49.459167Z",
     "start_time": "2019-11-18T09:24:00.519620Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "LGBMClassifier(bagging_fraction=0.85, boosting='gbdt', boosting_type='gbdt',\n",
      "        class_weight=None, colsample_bytree=1.0, feature_fraction=0.75,\n",
      "        importance_type='split', lambda_l1=2, learning_rate=0.01,\n",
      "        max_depth=5, metric='multi_error', min_child_samples=5,\n",
      "        min_child_weight=0.001, min_split_gain=0.0, n_estimators=2000,\n",
      "        n_jobs=-1, num_class=4, num_leaves=31, num_threads=20,\n",
      "        objective='multiclass', random_state=None, reg_alpha=0.0,\n",
      "        reg_lambda=0.0, seed=99, silent=True, subsample=1.0,\n",
      "        subsample_for_bin=200000, subsample_freq=0, verbose=-1)\n",
      "--------------------------------------------------\n",
      "--------------------------------------------------\n",
      "--------------------------------------------------\n",
      "--------------------------------------------------\n",
      "--------------------------------------------------\n",
      "--------------------------------------------------\n",
      "--------------------------------------------------\n",
      "--------------------------------------------------\n",
      "--------------------------------------------------\n",
      "--------------------------------------------------\n",
      "Train:  []\n",
      "Val:  []\n",
      "--------------------------------------------------\n"
     ]
    }
   ],
   "source": [
    "from sklearn.model_selection import StratifiedKFold\n",
    "from sklearn.metrics import roc_auc_score\n",
    "\n",
    "n_fold = 10\n",
    "skf = StratifiedKFold(n_splits = n_fold, shuffle = True)\n",
    "eval_fun = roc_auc_score\n",
    "\n",
    "def run_oof(clf, X_train, y_train, X_test, kf):\n",
    "    print(clf)\n",
    "    preds_train = np.zeros((len(X_train), 4), dtype = np.float)\n",
    "    preds_test = np.zeros((len(X_test), 4), dtype = np.float)\n",
    "    train_loss = []; test_loss = []\n",
    "\n",
    "    i = 1\n",
    "    for train_index, test_index in kf.split(X_train, y_train):\n",
    "        x_tr = X_train[train_index]; x_te = X_train[test_index]\n",
    "        y_tr = y_train[train_index]; y_te = y_train[test_index]\n",
    "        clf.fit(x_tr, y_tr, eval_set = [(x_te, y_te)], early_stopping_rounds = 500, verbose = False)\n",
    "        \n",
    "        # train_loss.append(eval_fun(y_tr, clf.predict_proba(x_tr)[:]))\n",
    "        # test_loss.append(eval_fun(y_te, clf.predict_proba(x_te)[:]))\n",
    "\n",
    "        preds_train[test_index] = clf.predict_proba(x_te)[:]\n",
    "        preds_test += clf.predict_proba(X_test)[:]\n",
    "\n",
    "        # print('{0}: Train {1:0.7f} Val {2:0.7f}/{3:0.7f}'.format(i, train_loss[-1], test_loss[-1], np.mean(test_loss)))\n",
    "        print('-' * 50)\n",
    "        i += 1\n",
    "    print('Train: ', train_loss)\n",
    "    print('Val: ', test_loss)\n",
    "    print('-' * 50)\n",
    "    # print('Train{0:0.5f}_Test{1:0.5f}\\n\\n'.format(np.mean(train_loss), np.mean(test_loss)))\n",
    "    preds_test /= n_fold\n",
    "    return preds_train, preds_test\n",
    "\n",
    "params = {\n",
    "    'learning_rate': 0.01,\n",
    "    'min_child_samples': 5,\n",
    "    'max_depth': 5,\n",
    "    'lambda_l1': 2,\n",
    "    'boosting': 'gbdt',\n",
    "    'objective': 'multiclass',\n",
    "    'n_estimators': 2000,\n",
    "    'metric': 'multi_error',\n",
    "    'num_class': 4,\n",
    "    'feature_fraction': .75,\n",
    "    'bagging_fraction': .85,\n",
    "    'seed': 99,\n",
    "    'num_threads': 20,\n",
    "    'verbose': -1\n",
    "}\n",
    "\n",
    "train_pred, test_pred = run_oof(lgb.LGBMClassifier(**params), \n",
    "                                np.concatenate([train_df.drop(['label'], axis=1).values, train_feat], axis=1), \n",
    "                                train_df['label'].values, \n",
    "                                np.concatenate([test_df.values, test_feat], axis=1), \n",
    "                                skf)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 141,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-11-18T09:25:57.962658Z",
     "start_time": "2019-11-18T09:25:57.953365Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.9558409785932722"
      ]
     },
     "execution_count": 141,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.mean(np.argmax(train_pred, 1) == train_df['label'].values)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 142,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-11-18T09:25:59.682322Z",
     "start_time": "2019-11-18T09:25:59.676693Z"
    }
   },
   "outputs": [],
   "source": [
    "submit_df = pd.DataFrame()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 143,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-11-18T09:26:00.237951Z",
     "start_time": "2019-11-18T09:26:00.226853Z"
    },
    "scrolled": true
   },
   "outputs": [],
   "source": [
    "submit_df['id'] = range(1, len(test_pred)+1)\n",
    "submit_df['label'] = np.argmax(test_pred, 1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 144,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-11-18T09:26:00.745836Z",
     "start_time": "2019-11-18T09:26:00.715837Z"
    }
   },
   "outputs": [],
   "source": [
    "submit_df.to_csv('lgb.csv', index=None, header=None)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.5.6"
  },
  "toc": {
   "base_numbering": 1,
   "nav_menu": {},
   "number_sections": true,
   "sideBar": true,
   "skip_h1_title": false,
   "title_cell": "Table of Contents",
   "title_sidebar": "Contents",
   "toc_cell": false,
   "toc_position": {},
   "toc_section_display": true,
   "toc_window_display": false
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
